Scroll to navigation

BASH(1) General Commands Manual BASH(1)

名前

bash - GNU Bourne-Again SHell

書式

bash [options] [file]

著作権

Bash is Copyright (C) 1989-2001 by the Free Software Foundation, Inc.

説明

bash は、標準入力やファイルから読み込んだコマンドを実行する、 sh 互換のコマンド言語インタプリタです。 bash には、Korn シェルや C シェル (kshcsh) の便利な機能も採り入れられています。

bash は IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2) に準拠する実装を目指しています。

オプション

bash は以下のオプションを起動時に解釈します (組み込みコマンド set の説明で述べられている 1 文字のシェルオプションも使えます):

-c オプションが指定されると、コマンドが string から読み込まれます。 string の後に引き数があれば、これらは 位置パラメータ (positional parameter: $0 からはじまるパラメータ) に代入されます。
-r オプションが指定されると、 bash制限された状態 (restricted) となります (後述の 制限付きのシェル を参照)。
-i オプションが指定されると、 bash対話的 (interactive) に動作します。
-s オプションが指定された場合と、 オプションをすべて処理した後に引き数が残っていなかった場合には、 コマンドは標準入力から読み込まれます。 このオプションを使うと、 対話的シェルを起動するときに 位置パラメータを設定できます。
二重引用符によるクォート文字列 (double-quoted strings) に $ が前置されたものを、全てリストして標準出力に出力します。 これらは、カレントロケールが C または POSIX 以外の時に、 翻訳の対象となるべき文字列です。 このオプションを指定すると、 自動的に -n オプションも指定されたことになります。 つまりコマンドは全く実行されません。
--
-- はオプションの終わりを示し、それ以降のオプション処理を行いません。 -- 以降の引き数は全て、ファイル名や引き数として扱われます。 引き数 --- と同じです。

bash が解釈するオプションには複数の文字からなるものもたくさんあります。 このようなオプションを認識させるためには、 コマンドライン中で 1 文字のオプションよりも前に置かなければなりません。

-D と同じですが、 出力は GNU gettextpo (ポータブルオブジェクト) ファイル形式で行われます。
-D と同じです。
使用方法についてのメッセージを標準出力に表示し、正常終了します。
--init-file file
対話的シェルとして起動された場合、 個人用の初期化ファイル ~/.bashrc の代わりに file からコマンドを実行します (後述の 起動 セクションを参照)。
ログインシェル (後述の 起動 セクションを参照) として起動されたかのように bash を動作させます。
シェルが対話的動作の場合、コマンドラインを読み込むときに GNU readline ライブラリを使用しません。
システム全体用の起動ファイル /etc/profile および個人用の初期化ファイル ~/.bash_profile, ~/.bash_login, ~/.profile のいずれも読み込みません。デフォルトでは、 bash はログインシェルとして起動された時に これらのファイルを読み込みます (後述の 起動 セクションを参照)。
シェルが対話的動作を行う場合に、個人用初期化ファイル ~/.bashrc の読み込み・実行を行いません。シェルが sh として起動された場合には、このオプションはデフォルトで有効になります。
bash の動作のうち、 デフォルトの振舞いが POSIX 1003.2 の標準と異なる部分を、 標準に適合するように変更します (posix モード)。
シェルの動作を制限します (後述の 制限付きのシェル セクションを参照)。
-v と同じです。
実行された bash のバージョン情報を標準出力に表示し、正常終了します。

引き数

オプション処理の後に引き数が残っており、かつ -c オプションと -s オプションのいずれも指定されていない場合、 最初の引き数はファイル名とみなされ、 そのファイルにシェルコマンドが記述されているとみなされます。 このように bash が起動された場合、 $0 にそのファイルの名前が設定されます (残りの引き数は位置パラメータに設定されます)。 bash はこのファイルからコマンドの読み込みと実行を行い、そして終了します。 bash の終了ステータスは、 このスクリプト中で実行された最後のコマンドの終了ステータスになります。 コマンドが全く実行されなければ、終了ステータスは 0 です。

起動

ログインシェル(login shell)とは、0 番目の引き数の最初の文字が - であるシェル、または --login オプション付きで起動されたシェルのことです。

対話的なシェルとは、 オプションでない引数がなく、 標準入力と標準出力がいずれも端末に接続されていて (これは isatty(3) で調べられます)、 -c オプションが指定されていない状態で起動されたシェル、または -i オプション付きで起動されたシェルのことです。 bash が対話的に動作している場合には、 PS1 が設定され、 $-i が含まれます。 これを利用すると、対話的動作の状態であるかどうかを、 シェルスクリプトや起動ファイルの内部で調べられます。

以下の段落では、 bash がどのように起動ファイルを実行するかを説明します。 以下のファイルのいずれかが、 「存在しているが読み込みできない」場合は、 bash はエラーを報告します。ファイル名に含まれるチルダは、 後述の 展開 セクションにおける チルダ展開 の項目で述べるように展開されます。

bash が対話的なログインシェルとして起動されるか、 --login オプション付きの非対話的シェルとして起動されると、 /etc/profile ファイルが存在すれば、 bash はまずここからコマンドを読み込んで実行します。 このファイルを読んだ後、 bash~/.bash_profile, ~/.bash_login, ~/.profile をこの 順番で探します。 bash は、この中で最初に見つかり、かつ読み込みが可能であるファイルから コマンドを読み込んで実行します。 --noprofile オプションを使ってシェルを起動すれば、 この動作を行わないようにできます。

ログインシェルが終了するときには、 ~/.bash_logout ファイルがあれば、 bash はこれを読み込んで実行します。

ログインシェルでない対話的シェルとして起動されると、 ~/.bashrc ファイルがあれば、 bash はここからコマンドを読み込み、実行します。 この動作は --norc オプションで行わないようにできます。 --rcfile file オプションを使うと、 コマンドの読み込みと実行を ~/.bashrc からでなく file から行わせることができます。

(例えばシェルスクリプトを実行するために) 非対話的に起動されると、 bash は環境変数 BASH_ENV を調べ、この変数が定義されていればその値を展開し、 得られた値をファイル名とみなして、 そこからコマンドの読み込みと実行を行います。 つまり bash は以下のコマンドが実行されたのと同じように動作します:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

ただし、ファイル名を探すために PATH 環境変数の値が使われることはありません。

sh という名前で bash を起動すると、 bash は古くからある sh の起動動作をできるだけ真似しようとします。 また POSIX 標準にもできるだけ従おうとします。 対話的なログインシェルとして起動されると、 あるいは --login オプション付きの非対話的シェルとして起動されると、 このシェルはまず /etc/profile~/.profile の順でコマンドの読み込みと実行をしようとします。 --noprofile オプションを使うと、この動作を行わないようにできます。 sh という名前の対話的シェルとして起動されると、 bash は環境変数 ENV を調べ、この変数が定義されていればその値を展開し、 展開で得た値をコマンドの読み込みと実行を行うためのファイル名として使います。 sh という名前で起動されたシェルは、 他の起動ファイルからコマンドの読み込みと起動を行うことはないので、 --rcfile オプションは全く効果を持ちません。 sh という名前の非対話的シェルとして起動されると、 このシェルは他の起動ファイルを何も読み込みません。 sh として起動された場合、 bash は起動ファイルの読み込みを行った後に POSIX モードに入ります。

--posix コマンドラインオプション等により bashPOSIX モードで起動されると、 bash は起動ファイルに関して POSIX 標準に従います。 このモードでは、対話的シェルは ENV 環境変数を展開し、 展開して得られた名前のファイルからコマンドの読み込みと実行を行います。 他の起動ファイルは全く読み込みません。

bash は、自分を起動したのがリモートシェルデーモン (通常は rshd) かどうかを調べます。 rshd によって実行されていると bash が判断した場合、 ~/.bashrc が存在し、かつ読み込み可能であれば、 bash はコマンドをこのファイルから読み込んで実行します。 sh として呼び出された場合には、この動作は行いません。 --norc オプションを使えばこの動作を禁止できますし、 --rcfile オプションを使えば他のファイルを読ませるようにもできます。 しかし一般的には rshd は これらのオプションを付けてシェルを起動しませんし、 指定もできないようになっています。

シェルが実ユーザ (グループ) ID と異なる実効ユーザ (グループ) ID で起動され、 かつ -p オプションが与えられていない場合は、 起動ファイルは全く読み込まれず、シェル関数は環境から継承されず、 SHELLOPTS が環境変数に含まれていても無視され、 実効ユーザ ID には実ユーザ ID が設定されます。 -p オプションが起動時に与えられた場合、 起動時の動作は同じですが、 実効ユーザ ID は再設定されません。

定義

このドキュメントの残りの部分では、 以下の定義を使用します。

ブランク (blank)
空白文字またはタブ文字
単語 (word)
シェルが 1 単位とみなす文字並び。 トークン(token) とも言われます。
名前 (name)
英数字とアンダースコア文字だけから構成され、 かつ最初の文字が英字かアンダースコア文字である 単語識別子 (identifier) とも言われます。
メタ文字 (metacharacter)
クォートされていない場合に、単語区切りとなる文字。 以下の文字のうちのいずれかです:

| & ; ( ) < > スペース タブ

制御演算子
制御機能を持つトークン。 以下のシンボルのうちのいずれかです:

|| & && ; ;; ( ) | <newline>

予約語

予約語 (reserved word) とはシェルにとって特別な意味を持つ単語です。 以下の単語がクォートされておらず、 かつ単純なコマンド (simple command) の 先頭の単語 (後述の シェルの文法 を参照) であるか、 case コマンドや for コマンドの 3 番目の単語である場合には、予約語として認識されます:

! case do done elif else esac fi for function if in select then until while { } time [[ ]]

シェルの文法

単純なコマンド (Simple Commands)

単純なコマンド (simple command) とは、 変数の代入を並べたもの (これは省略可能です) の後に、 ブランク区切りの単語とリダイレクションを記述し、 最後に制御演算子を置いたものです。 最初の単語は実行するコマンドを指定します。 残りの単語は起動されるコマンドに引き数として渡されます。

単純なコマンドの返り値はコマンドの終了コードですが、シグナル n を受けてコマンドが終了した場合には 128+n となります。

パイプライン (Pipeline)

パイプライン (pipeline)は、記号 | で区切った 1 つ以上のコマンド列です。 パイプラインのフォーマットを以下に示します:

[time [-p]] [ ! ] command [ | command2 ... ]

command の標準出力は command2 の標準入力に接続されます。 この接続は、 コマンドで指定したどのリダイレクションよりも先に実行されます (後述の リダイレクション を参照)。

パイプラインの前に、予約語である ! がある場合、 そのパイプラインの終了ステータスは最後のコマンドの終了ステータスの論理値の NOT を取ったものになります。 それ以外の場合には、 パイプラインのステータスは最後のコマンドの終了ステータスになります。 値を返す前に、シェルはパイプライン中の全てのコマンドが終了するのを待ちます。

パイプラインの前に予約語 time がある場合、コマンドの実行にかかった 経過時間・ユーザ時間・システム時間がパイプラインの終了時に報告されます。 -p オプションを指定すると、 出力フォーマットが POSIX 仕様に変わります。 変数 TIMEFORMAT には、経過時間情報の表示の仕方を指定するフォーマット文字列を 設定できます (後述の シェル変数 の項の TIMEFORMAT に関する説明を参照)。

パイプライン中の各コマンドは、それぞれ別のプロセスとして (つまりサブシェル内で) 実行されます。

リスト

リスト (list) とは、1つ以上のパイプラインを演算子 ;, &, &&, ⎪⎪ のいずれかで区切って並べ、最後に ;, &, <newline> のいずれか (これは省略可能です) を置いたものです。

リスト演算子のうち、 &&⎪⎪ の優先順位は同じです。これらの次に、 ;& が同じ優先順位で続きます。

コマンドが制御演算子 & で終わっている場合、シェルはコマンドをサブシェル内で バックグラウンド (background) で実行します。 シェルはコマンドが終了するのを待たずに、返却ステータス 0 を返します。 コマンドを ; で区切った場合には、これらは順番に実行されます。 シェルはそれぞれのコマンドが終了するのを順番に待ちます。 返却ステータスは、最後に実行したコマンドの終了ステータスになります。

制御演算子 && は AND リストを示し、 ⎪⎪ は OR リストを示します。 AND リストは

command1 && command2

という形式であり、 command1 が終了ステータス 0 を返した場合に限り command2 が実行されます。

OR リストは

command1 ⎪⎪ command2

という形式であり、 command1 が 0 以外の終了ステータスを返した場合に限り command2 が実行されます。AND リストと OR リストの返却ステータスは、 リスト中で最後に実行されたコマンドの終了ステータスです。

複合コマンド(Compound Commands)

複合コマンド (compound command) を以下に示します:

(list)
list はサブシェル内で実行されます。 シェルの環境に影響を与えるような変数の代入や組み込みコマンドは、 コマンドの終了後に影響を残しません。 返却ステータスは list の終了ステータスです。
{ list; }
list が単に現在のシェル環境で実行されます。 list の最後は改行文字かセミコロンでなければなりません。これは グループコマンド(group command) と呼ばれます。返却ステータスは list の終了ステータスです。
((expression))
expression が後述の 算術式評価 で説明される規則に従って評価されます。 式の値が 0 でない場合、返却ステータスは 0 になります。そうでない場合、 返されるステータスは 1 になります。これは let "expression" と全く同じものです。
[[ expression ]]
条件式 expression の評価値に従って 0 または 1 を返します。 式は後述の 条件式 で説明する、プライマリによって構成されます。 単語分割とパス名展開は [[]] の間の単語に対しては行われません。 チルダ展開、パラメータと変数の展開、算術式展開、コマンド置換、 プロセス置換、クォート除去は実行されます。

== 演算子と != 演算子が使われたとき、 演算子の右の文字列はパターンと解釈され、 後述のパターンマッチングで説明する規則に従ってマッチングが行われます。 文字列がパターンにマッチすれば返り値は 0 であり、 マッチしなければ返り値は 1 になります。 パターンの任意の部分をクォートして、文字列としてマッチさせることもできます。

式は以下の演算子を使って繋げられます。 以下に演算子を優先度の順に示します:

( expression )
expression の値を返します。これを用いて、 演算子の通常の優先度を変更できます。
! expression
expression が偽ならば真になります。
expression1expression2 が両方とも真であれば真になります。
expression1expression2 のどちらかが真であれば真となります。

expression1 の値だけで条件式全体の返り値が決定できれば、 && 演算子と || 演算子は expression2 を実行しません。

in に続く単語のリストが展開され、要素のリストが生成されます。 変数 name には、このリストの各要素が順番にセットされ、その度に list が実行されます。「in word」が省略された場合、 for コマンドは、設定されている位置パラメータそれぞれに対して list を一度ずつ実行します(後述の パラメータ を参照)。 返却ステータスは実行された最後のコマンドの終了ステータスになります。 in に続く要素を展開した結果が空となった場合、 コマンドは全く実行されず、返却ステータス 0 が返されます。
最初に、算術式expr1が、後述の 算術式評価 で説明される規則に従って評価されます。 次に、算術式expr2がゼロになるまで繰り返し評価されます。 算術式expr2の評価結果がゼロでなければ、その度毎にlistが実行され、 算術式expr3が評価されます。 どの算術式も省略された場合は、 評価結果が 1 とみなされた場合のように振る舞います。 返却ステータスは list 中で実行された 最後のコマンドの終了ステータスとなりますが、 算術式のいずれかが無効である場合には不正な値となります。
in に続く単語のリストが展開され、要素のリストが生成されます。 展開された単語の集合が番号付きで標準エラー出力に出力されます。 「in word」が省略された場合、 位置パラメータが出力されます (後述の パラメータ を参照)。続いて PS3 が表示され、標準入力から 1 行の読み込みが行われます。 表示された単語のいずれかに対応する数字がこの行に含まれていれば、 name の値としてその単語が設定されます。 行が空であれば、単語とプロンプトが再び表示されます。 EOF を読み込むとコマンドが終了します。 これ以外の値の場合には、 name には空文字列が設定されます。読み込んだ行は変数 REPLY に格納されます。 break または return コマンドが実行されるまで、選択を行うたびに list が実行されます。 select の終了ステータスは、 list 中で最後に実行したコマンドの終了ステータスですが、 コマンドが全く実行されなかった場合には 0 となります。
case コマンドは最初に word を展開し、それぞれの pattern に対して順にマッチングを試みます。 マッチングの際にはパス名展開 (後述の パス名展開 を参照) と同じ規則が用いられます。 マッチするものが見つかると、これに対応する list が実行されます。 マッチするものが見つかったら、それ以降のマッチングは行われません。 マッチするパターンが無ければ、終了ステータスは 0 になります。 マッチするものがあったら、終了ステータスは list 中で最後に実行されたコマンドの終了ステータスになります。
最初に if list が実行されます。この終了ステータスが 0 ならば、then list が実行されます。 そうでなければ elif list がそれぞれ順番に実行され、 この終了ステータスが 0 ならば、対応する then list が実行され、コマンドが終了します。そうでなければ、else list が (もし存在すれば) 実行されます。 終了ステータスは最後に実行されたコマンドの終了ステータスですが、 真と評価された条件が全く無い場合には 0 となります。
while list; do list; done
while コマンドは、list 中の最後のコマンドが終了ステータス 0 を返すまで、繰り返して do list を実行します。until コマンドは while コマンドとほぼ同じですが、 評価の条件が否定となる点が異なります。 do list は、 list 中の最後のコマンドが 0 以外の終了ステータスを返す限りずっと実行されます。 while コマンドと until コマンドの終了ステータスは、 do list で実行された最後のコマンドの終了ステータスになりますが、 コマンドが全く実行されなかった場合には 0 になります。
[ function ] name () { list; }
name という名前の関数を定義します。関数の本体(body)は、 { と } で囲まれたコマンドの リスト です。単純なコマンドの名前として name が指定されると、 必ずこのリストが実行されます。 関数の終了ステータスは、 関数本体で最後に実行されたコマンドの終了ステータスです (後述の 関数 を参照)。

コメント (COMMENTS)

シェルが対話的でない場合、または対話的なシェルにおいて 組み込みコマンドの shopt に対する interactive_comments オプションが有効となっている (後述の シェルの組み込みコマンド を参照すること) 場合には、 # で始まる単語があると、その単語とその行の残りの文字が全て無視されます。 対話シェルでは、 interactive_comments オプションが有効でなければコメントは使えません。対話シェルでは、 interactive_comments オプションはデフォルトで有効になっています。

クォート

クォート (quoting) を使うと、 特定の文字や単語のシェルに対する特別な意味を取り除けます。 クォートを用いると、特殊文字の特殊な扱いを無効にすることや、 予約語が予約語として識別されることを防いだり、 パラメータの展開を防げます。

前述の 定義 で挙げたメタ文字 (metacharacters) にはそれぞれ特殊な意味があるので、 その文字自身を表すためにはクォートしなければなりません。

コマンド履歴展開機能が使われている場合、履歴の展開を防ぐためには、 履歴展開 (history expansion) 文字 (普通 !) をクォートしなければなりません。

クォートの方法には、 エスケープ文字(escape character), シングルクォート、ダブルクォートの 3 種類があります。

クォートされていないバックスラッシュ (\) は エスケープ文字 です。エスケープ文字は <newline> という例外を除き、 後に続く文字 1 つの文字としての値を保持させます。 \<newline> という組合せが現われ、 かつバックスラッシュ自身がクォートされていない場合には、 \<newline> は行を継続することを表します (つまり、入力ストリームから改行文字が削除され、実質的に無視されます)。

シングルクォートで文字を囲むと、 クォート内部のそれぞれの文字は文字としての値を保持します。 シングルクォートの間にシングルクォートを置くことはできません。 これはバックスラッシュを前に付けても同じです。

ダブルクォートで文字を囲むとクォート内部の全ての文字は文字としての値を 保持しますが、 $, `, \ は例外となります。 $` はダブルクォートの内部でも特殊な意味を失いません。 バックスラッシュの場合は、次の文字が $, `, ", \, <newline> のいずれかである場合に限り特殊な意味を失いません。 前にバックスラッシュを付ければ、 ダブルクォート文字をダブルクォートによるクォートの内部で クォートできます。

特殊なパラメータである *@ は、ダブルクォート内部でも特殊な意味を失いません (後述の パラメータ を参照)。

$'string' の形式を持つ単語は特殊な扱いを受けます。 この単語は string に展開され、 それから ANSI C 標準で仕様が決められている、 バックスラッシュでエスケープされている文字に置き換えられます。 バックスラッシュエスケープシーケンスは、 (もし存在すれば) 以下のようにデコードされます:

警告 (ベル)
バックスペース
エスケープ文字
フォームフィード文字
改行文字
復帰文字
水平タブ文字
垂直タブ文字
\\
バックスラッシュ
\'
シングルクォート
ASCII コードの 8 進値が nnn である文字 (1 文字につき数字 3 桁)。
\xnnn
ASCII コードの 16 進値が nnn である文字 (1 文字につき数字 3 桁)。

展開された結果はシングルクォートされているのと同じ状態で、 ドル記号は存在しなかったかのように扱われます。

ダブルクォートされた文字列の前にドル記号($)があると、 文字列は現在のロケールに従って変換されます。 現在のロケールが C または POSIX ならば、 ドル記号は無視されます。文字列が変換されたり置換された場合には、 その結果はダブルクォートされているのと同じ状態になります。

パラメータ

パラメータ (parameter) は値を保持するためのものです。パラメータは 名前、 数字、後述の 特殊なパラメータ で挙げる特殊文字のいずれかで表現されます。シェルでの用法においては、 変数(variable) とは 名前 で表現されたパラメータです。

パラメータに値が代入されていれば、 そのパラメータは設定 (set) されていると言われます。 空文字列も有効な値です。一度値を設定すると、組み込みコマンドの unset を使わなければ設定を取り消す (unset する) ことはできません (後述の シェルの組み込みコマンド を参照)。

変数 には、以下の構文で代入できます:

name=[value]

value が与えられなかった場合、変数には空文字列が代入されます。全ての value に対して、チルダ展開、パラメータと変数の展開、コマンド置換、 算術式展開、クォート除去が行われます (後述の 展開 を参照)。変数の 整数 属性が設定されている場合 (後述の シェルの組み込みコマンド を参照)、$((...)) の展開を使っていなくても value に対しての算術展開が行われます (後述の 算術式展開 を参照)。 特殊パラメータ で後述する "$@" という例外を除いて、単語の分割は行われません。 パス名展開も実行されません。

位置パラメータ(Positional Parameters)

位置パラメータ (positional parameter) は、1 桁以上の数値で表されるパラメータです。ただし 0 は含みません。 位置パラメータは、シェルが起動されたときにシェルの引き数が代入されますが、 組み込みコマンドの set を使って代入し直すこともできます。 代入文を使って位置パラメータへの代入を行うことはできません。 シェル関数が実行されると、 位置パラメータは一時的に置き換えられます (後述の 関数 を参照)。

2 桁以上の数値を含む位置パラメータを展開するときには、ブレース ({}) で囲まなければなりません (後述の 展開 を参照)。

特殊パラメータ

シェルはいくつかのパラメータを特別扱いします。 このようなパラメータは参照されるだけであり、 値を代入することは許されません。

*
(1 から始まる) 全ての位置パラメータに展開されます。 ダブルクォートの内部で展開が行われたときは、 それぞれのパラメータを特別な変数である IFS の最初の文字で区切って並べた 1 つの単語に展開されます。つまり、 "$*" は "$1c$2c..." と同じです。 ここで c は変数 IFS の値の最初の文字です。 IFS が設定されていなければ、パラメータは空白で区切られます。 IFS が空文字列の場合、パラメータの間には区切り文字は入らず、 全てのパラメータは繋げられます。
@
(1 から始まる) 全ての位置パラメータに展開されます。 ダブルクォートの内部で展開が行われたときは、 それぞれのパラメータは別々の単語に展開されます。 つまり "$@" は "$1" "$2" ... と同じです。 位置パラメータが無い場合には、"$@" と $@ を展開しても空文字列になります (つまり取り除かれます)。
#
位置パラメータの個数を示す 10 進値に展開されます。
?
最後に実行されたフォアグラウンドのパイプラインの 終了ステータスに展開されます。
-
現在のオプションフラグに展開されます。 これは起動の時に指定したり、組み込みコマンド set で設定したり、( -i オプション等で) シェル自身が設定したりします。
$
シェルのプロセス ID に展開されます。 () を使ったサブシェルの内部では、$ はサブシェルではなく、 現在のシェルのプロセス ID に展開されます。
!
最後に実行されたバックグラウンド (非同期) コマンドの プロセス ID に展開されます。
0
シェルまたはシェルスクリプトの名前に展開されます。 これはシェルの初期化時に設定されます。 コマンドを記述したファイルを指定して bash を起動した場合、 $0 にはそのファイルの名前が設定されます。 -c オプションを付けて bash を起動した場合、実行する文字列の後に引き数があれば、その最初の値が $0 に設定されます。このオプションを指定していない場合には、 bash を起動する時に使用した名前が引き数 0 として与えられ $0 に設定されます。
_
シェルの起動時には、引き数リストで渡された、 実行するシェルまたはシェルスクリプトの絶対ファイル名が設定されます。 その後は、前のコマンドに対する最後の引き数 (展開後のもの) に展開されます。 また、実行する各コマンドの完全なファイル名が設定され、 そのコマンドの環境にエクスポートされます。 メールをチェックするときには、 このパラメータは現在チェックしているメールのファイル名を保持します。

シェル変数

以下の変数はシェルが設定します:

そのシェルの親のプロセス ID。この変数は読み込み専用です。
cd コマンドで設定された現在の作業ディレクトリ。
cd コマンドで設定された、1 つ前の作業ディレクトリ。
組み込みコマンド read に引き数が与えられなかった時に読み込まれた行が設定されます。
現在のユーザのユーザ ID に展開されます。 初期化はシェルの起動時に行われます。 この変数は読み込み専用です。
現在のユーザの実効ユーザ ID に展開されます。 初期化はシェルの起動時に行われます。 この変数は読み込み専用です。
現在のユーザがメンバになっているグループのリストを含んだ配列変数です。 GROUPS への代入は効果がなく、エラーステータスを返します。 GROUPS が unset された場合はこの変数の特殊な性質はなくなります。 その後に再設定されたとしても元に戻りません。
現在実行している bash を起動したときに使われた、完全なファイル名に展開されます。
現在実行している bash のバージョンを示す文字列に展開されます。
読み込み専用の配列変数で、配列の各要素は現在実行されている bash のバージョン情報を持っています。 配列変数の要素に代入される内容を以下に示します:

メジャーバージョン番号 (リリース)。
マイナーバージョン番号 (バージョン)。
パッチレベル。
ビルドバージョン。
リリースステータス (beta1 など)。
MACHTYPE の値。
bash の実体が起動されるたびに 1 ずつ増えます。
このパラメータが参照される度に、 0 から 32767 までのランダムな整数が生成されます。 RANDOM に値を代入すると、乱数の列を初期化できます。 RANDOMunset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
このパラメータを参照すると、シェルが起動されてからの秒数が返されます。 SECONDS に値を代入した場合、それ以降の参照において返される値は、 代入された値と代入以降の秒数を足した値になります。 SECONDSunset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
この変数が参照されると、 シェルはスクリプトや関数における現在の行番号 (1から始まります) を表す 10 進値を代入します。スクリプトや関数の内部でない場合には、 意味のある値が代入されることは保証されません。 LINENOunset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
現在のコマンドの履歴番号 (履歴リストにおけるインデックス) です。 HISTCMDunset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
現在実行中のシェル関数の名前です。 この変数はシェル関数を実行している間のみ存在します。 FUNCNAME への代入は効果がなく、エラーステータスを返します。 FUNCNAMEunset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
現在のディレクトリスタックの内容を持つ配列変数 (後述の 配列 を参照) です。組み込みコマンド dirs を使うと、スタック中のディレクトリがスタック順に表示されます。 配列変数の要素に代入を行うと、 既にスタックに入っているディレクトリを変更できますが、 ディレクトリの追加と削除を行うためには、組み込みコマンドの pushdpopd を使わなければなりません。 この変数に代入を行っても現在の作業ディレクトリは変わりません。 DIRSTACKunset すると、この変数の特殊な性質は無くなります。後で再び set しても元には戻りません。
フォアグラウンドのパイプラインで最後に実行されたプロセスの 終了ステータスのリストを含む配列変数です (後述の 配列 を参照)。
組み込みコマンド getopts で処理した最後のオプション引き数の値です (後述の シェルの組み込みコマンド を参照)。
組み込みコマンド getopts で次に処理されるオプション引き数のインデックスです (後述の シェルの組み込みコマンド を参照)。
現在のホスト名が自動的に設定されます。
bash を実行するマシンの種類をユニークに記述する文字列が自動的に設定されます。 デフォルト値はシステム依存です。
bash を実行するオペレーティングシステムを記述する文字列が自動的に設定されます。 デフォルト値はシステム依存です。
bash を実行するシステムの種類を完全に指定する文字列が、 GNU 標準の cpu-company-system の形式で設定されます。 デフォルト値はシステム依存です。
コロン区切りのリストで、有効になっているシェルのオプションを示します。 リスト中のそれぞれの単語は、組み込みコマンド set-o オプション (後述の シェルの組み込みコマンド を参照) に対する有効な引き数になっています。 SHELLOPTS に入っているオプションは、set -o を実行した場合にも on であると報告されます。 この変数が bash の起動時に環境変数に入っていた場合、 どの起動ファイルを読むよりも前にリスト中のシェルオプションが有効になります。 この変数は読み込み専用です。
現在のコマンドラインの各単語からなる配列変数 (後述の 配列 参照) です。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。
現在カーソル位置が置かれている単語の ${COMP_WORDS} におけるインデックスです。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。
現在のコマンドラインです。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。
現在のコマンドの先頭からの相対値として与えられた カーソル位置のインデックスです。 現在のカーソル位置が現在の現在のコマンドの最後にある場合、 この変数の値は ${#COMP_LINE} と等しくなります。 この変数はプログラム補完機能 (後述の プログラム補完 を参照) から呼ばれたシェル関数においてのみ有効です。

以下の変数はシェルが使用します。場合によっては、 bash がデフォルト値を変数に代入します。このような場合については後述します。

内部フィールド区切り文字 (Internal Field Separator) です。展開を行った後に単語を分割する場合や、組み込みコマンドの read を使った時に行を単語に分割する場合に使われます。 デフォルト値は ``<空白><タブ><改行>'' です。
コマンドの検索パスです。 シェルがコマンドを検索するディレクトリをコロンで区切って並べたリストです (後述の コマンドの実行 を参照)。デフォルトのパスはシステム依存で、 bash をインストールしたシステム管理者が設定します。 一般的な値は ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.'' です。
現在のユーザのホームディレクトリです。 組み込みコマンド cd のデフォルトの引き数になります。 この変数の値は、チルダ展開を実行するときにも使われます。
cd コマンドの検索パスです。これは、 cd コマンドで指定した対象ディレクトリを探すディレクトリを コロンで区切って並べたリストです。 例えば、``.:~:/usr'' といった値になります。
bash がシェルスクリプトを実行する時にこの値が設定されている場合、 この値は (~/.bashrc のように) シェルを初期化するコマンドが書かれているファイル名と解釈されます。 BASH_ENV の値をファイル名として処理する前には、パラメータ展開、コマンド置換、 算術的展開が行われます。 この結果のファイルを検索する際には PATH は使用されません。
このパラメータにファイル名が設定されており、かつ変数 MAILPATH が設定されていなければ、 bash は指定されたファイルへのメールの到着をユーザに通知します。
bash がメールをチェックする頻度を (秒数で) 指定します。 デフォルト値は 60 秒です。 メールをチェックする時間になると、 シェルはプライマリのプロンプトを表示する前にチェックを行います。 この変数が unset された場合、 あるいはこの変数に 0 より大きい数値以外が代入された場合は、 シェルはメールのチェックを行いません。
メールのチェックに使うファイル名をコロンで区切って並べたリストです。 特定のファイルにメールが到着したときに出力される メッセージは、`?' を使ってファイル名をメッセージから区切ることによって 指定できます。メッセージのテキスト中で使われたときは、 $_ は現在のメールファイルの名前に展開されます。 設定例:

MAILPATH='/var/mail/bfox?"You have mail":~/shell-mail?"$_ has mail!"'

この変数のデフォルト値は bash が与えますが、 bash が使うユーザのメールファイルの位置はシステム依存です (/var/mail/$USER 等)。

このパラメータの値は展開されてプライマリのプロンプト文字列として使われます。 (後述の プロンプト を参照)、 デフォルト値は ``\s-\v\$ '' です。
このパラメータの値は PS1 と同じように展開され、セカンダリのプロンプト文字列として使われます。 デフォルト値は ``> '' です。
このパラメータの値は select コマンド (前述の シェルの文法 を参照) のプロンプトとして使われます。
このパラメータは PS1 と同じように展開されます。この値は実行トレース中に bash が表示する各コマンド前に出力されます。 複数段の間接レベル (levels of indirection) を示すときは、 PS4 の最初の文字が必要に応じて複数回表示されます。 デフォルト値は ``+ '' です。
このパラメータの値は、予約語である time が先頭に付いているパイプラインに対して、 時間情報の表示の仕方を指定するフォーマット文字列として使われます。 % は、時間の値などに展開される エスケープシーケンスを示すための文字です。 エスケープシーケンスとその意味を以下に示します。 ただし、ブレース ([]) は省略可能であることを表しま す。

%%
% 文字そのもの。
%[p][l]R
経過した秒数。
%[p][l]U
ユーザモードで使われた CPU の秒数。
%[p][l]S
システムモードで使われた CPU の秒数。
%P
CPU のパーセンテージ。(%U + %S) / %R で算出されます。
p 省略可能で、精度 (precision) が何桁であるかを指定します。 つまり小数点以下の桁数を指定します。この値が 0 ならば、 小数点や小数の部分は出力されません。 また、小数点以下で指定できるのは 3 桁までです。 つまり、p の値が 3 より大きければ 3 に変更されます。 p を指定しなければ、この値は 3 となります。
l は省略可能ですが、指定すると、分を含み、 MMmSS.FF という形式の長いフォーマットになります。 小数を含むかどうかは p の値によって決まります。
この変数が設定されていなければ、 bash$'\nreal\t%3lR\nuser\t%3lU\nsys%3lS' という値が指定されているかのように動作します。 この値が空文字列ならば、時間の情報は表示されません。 フォーマット文字列の表示の際には、末尾に改行文字が追加されます。
コマンド履歴に記憶するコマンドの数 (後述の HISTORY を参照)。
コマンド履歴が保存されるファイルの名前 (後述の 履歴 を参照)。デフォルト値は ~/.bash_history です。 設定されていない場合、 対話シェルが終了する時に履歴の保存が行われません。
履歴ファイルに保持する履歴の最大数です。この変数に値が代入された場合、 その行数を越えないように、必要に応じて履歴ファイルが切り詰められます。 デフォルト値は 500 です。対話シェルが終了する時にも、 履歴ファイルのサイズはファイル書き込みの後にこのサイズに切り詰められます。
値として 1 が設定されている場合、 bash は組み込みコマンド getopts (後述の シェルの組み込みコマンド を参照) を使って生成したエラーメッセージを表示します。 シェルが起動されたり、シェルスクリプトが実行される度に、 OPTERR は 1 に初期化されます。
LC_ で始まる変数で特に選択されない任意のカテゴリに対して、 ロケールのカテゴリを決めるために使います。
この変数はロケールのカテゴリを指定する LC_ 変数と LANG の 値を全て上書きします。
この変数はパス名展開の結果をソートするときに使用される照合順序と、 パス名展開とパターンマッチングにおける 範囲展開、同値クラス、照合シーケンスの動作決定します。
この変数は、パス名展開とパターンマッチングにおける 文字の解釈と文字クラスの挙動を決めます。
この変数は、$ の後に続くダブルクォートされた文字列の 翻訳に使うロケールを決めます。
この変数は数字のフォーマットに使用するロケールカテゴリを決定します。
組み込みコマンド select によって、選択されたリストを表示する際の行数の決定に用いられます。 SIGWINCH を受信すると自動的に設定されます。
組み込みコマンド select によって、選択されたリストを表示する際の端末幅の決定に用いられます。 SIGWINCH を受信すると自動的に設定されます。 PROMPT_COMMAND 設定されていると、プライマリプロンプトを出す前に毎回、 この値がコマンドとして実行されます。
単独で入力された EOF 文字を受け取ったときの対話シェルの動作を制御します。 この変数が設定されていれば、指定されている値の数だけの EOF 文字を連続して行頭の文字として入力しなければ bash は終了しません。この変数に数値以外の値が設定されている場合や、 値が設定されていない場合には、デフォルト値として 10 が使われます。 この変数が存在しなければ、 EOF 文字はシェルへの入力の終わりを示します。
0 より大きい値が設定されていると、 この値はプライマリプロンプトを出した後に入力を待つ秒数として解釈されます。 この秒数だけ待った時点で入力が無ければ bash は終了します。
組み込みコマンド fc が使うデフォルトのエディタです。
ファイル名補完 (後述の READLINE を参照) を行う際に無視するサフィックスを コロンで区切って並べたリストです。 FIGNORE のエントリのいずれかにサフィックスがマッチするファイル名は、 ファイル名補完にマッチするファイルのリストから除外されます。 例えば値として ``.o:~'' を設定します。
パス名展開で無視するファイル名の集合を定義するパターンを コロンで区切って並べたリストです。 パス名展開パターンにマッチするファイル名が GLOBIGNORE 内のパターンのどれかにもマッチする場合、 これはマッチしたもののリストから削除されます。
readline の起動ファイルのファイル名です。これはデフォルト値の ~/.inputrc (後述の READLINE を参照) を上書きします。
ignorespace の値が設定されていると、 空白 文字で始まる行は履歴リストに入りません。 ignoredups の値が設定されていると、 履歴の最後の行にマッチする行は履歴リストに入りません。 ignoreboth の値はこれらの 2 つのオプションを同時に実現します。 設定されていないか上記のいずれの値でもない場合には、 パーザが読み込んだ全ての行は HISTIGNORE の値が示す条件の下で履歴リストに保存されます。 この変数は既に古くなっており、この機能は HISTIGNORE 変数で用いることになっています。 複数行にまたがる複雑なコマンドの場合は 2 番目以降の行が調べられることはありません。よって、これらは HISTCONTROL の値に関わらず履歴に追加されます。
どのコマンド行を履歴リストに保存するかを決めるために使うパターンを コロンで区切って並べたリストです。 それぞれのパターンは行の先頭と比較され、 行全体が完全に一致しなければなりません (`*' が暗黙的に追加されるこ とはありません)。各パターンの評価は HISTCONTROL で指定したチェックが行われた後の行に対して実行されます。 通常のシェルのパターンマッチング文字以外に、 `&' が履歴の前の行にマッチします。 バックスラッシュを使って `&' をエスケープできます。 マッチングを試みる前にバックスラッシュは取り除かれます。 複数行にまたがる複雑なコマンドの場合、2 番目以降の行は調べられません。 よって、これらは HISTIGNORE の値に関わらず履歴に追加されます。
2 文字または 3 文字で、 履歴の展開とトークン分割 (後述の 履歴展開 を参照) を制御します。 最初の文字は 履歴展開 (history expansion) 文字であり、 履歴展開の先頭を示す文字です。通常、これは `!' です。 2 番目の文字は 簡易置換 (quick substitution) 文字であり、前に入力したコマンドの文字列を 別の文字列に置き換えて再実行を行うための省略表現として使います。 デフォルト値は `^' です。 3 番目の文字は省略可能です。単語の先頭でこの文字が見つかると、 行の残りの部分がコメントとなるような文字を指定します。 これは通常は `#' です。 履歴コメント文字があると、 その行の残りの単語に対する履歴置換はスキップされます。 この文字があるからといって、 必ずしもシェルのパーザが行の残りの部分をコメントとして扱うわけではありません。
/etc/hosts と同じフォーマットであり、 シェルがホスト名を補完する必要があるときに読み込むファイルの名前を示します。 シェルの実行中でも補完するホスト名のリストを変更できます。 この変数が変更された次の機会にホスト名の補完を試みるとき、 bash は新しいファイルの内容を既存のデータベースに追加します。 HOSTFILE が設定されているがその値が空文字列の場合、 bash は補完可能なホスト名のリストを取得するために /etc/hosts を使用します。 HOSTFILE が unset された場合は、ホスト名のリストはクリアされます。
この変数はシェルがユーザとジョブ制御の相互作用をどのように扱うかを決めます。 この変数を設定した場合、1 語からなるリダイレクト無しの単純なコマンドが、 停止中ジョブの実行再開候補として扱われます。 曖昧な指定は許されません。 入力された文字列で始まるジョブが複数ある場合には、 最後にアクセスされたものが選ばれます。 ここでの 名前 とは、コマンドを起動する際に使ったコマンドラインのことです。 この値に exact が設定されている場合、 与えられた文字列は停止しているジョブの名前に 正確にマッチしなければなりません。 substring が設定されている場合は、 与えられた文字列は停止しているジョブの名前の部分文字列に マッチする必要があります。 substring という値は、ジョブ識別子の %? に似た機能を持っています (後述の ジョブ制御 を参照)。これ以外の値が設定されている場合、 与えられた文字列は停止しているジョブの名前の プレフィックスでなければなりません。これはジョブ識別子の % と似た機能を持っています。
bash が可能な補完候補を読み込む配列変数です。 この値はプログラム補完機能 (後述の プログラム補完 を参照) によって呼び出されたシェル関数によって生成されます。

配列

bash は 1 次元の配列変数を扱うことができます。 全ての変数は配列として使用できます。 declare 組み込みコマンドを使えば、明示的に配列を宣言できます。 配列のサイズの上限はありませんし、 メンバのインデックス付けや代入を 連続的にしなければならないという条件もありません。 配列のインデックス付けは 0 から始まる整数を用いて行います。

変数の代入の際に name[subscript]=value という記法が使われた場合、配列は自動的に生成されます。 subscript は算術式として扱われますが、この式は評価すると 0 以上の数値になるものでなければなりません。 明示的に配列を宣言するには、 declare -a name を使います (後述の シェルの組み込みコマンド を参照)。 declare -a name[subscript] も許されます。subscript は無視されます。 組み込みコマンドの declarereadonly を使うと、配列変数に対して属性を設定できます。 どちらの属性も配列のメンバ全てに対して適用されます。

配列の代入は name=(value1 ... valuen) という形式の複合代入 (compound assignment) を用いて行います。 ここでそれぞれの value の形式は [subscript]=string です。 必要なのは string だけです。 ブラケット([])と添字を省略しなかった場合、 そのインデックスに対して代入が行われます。 省略した場合には、代入される要素のインデックスは、 その文の中で直前に代入されたインデックスに 1 を加えたものになります。 インデックスは 0 から始まります。 この記法は組み込みコマンド declare でも使えます。個別の配列要素に対する代入は、先に説明した name[subscript]=value の記法を使って行います。

配列の任意の要素は、${name[subscript]} を使って参照できます。 パス名展開との衝突を避けるためにブレースが必要です。 添字(subscript)@* ならば、その単語は name の全ての要素に展開されます。これらの添字が異なるのは、 単語がダブルクォートの内部にある場合だけです。 単語がダブルクォートされていれば、${name[*]} は 1 つの単語に展開されます。 この単語は、配列の各メンバの値を特殊変数 IFS の値で区切って並べたものです。${name[@]}は、 name の各要素を別々の単語に展開します。 配列のメンバが全く無いときは、${name[@]} は空の単語に展開されます。 これは特殊パラメータ *@ に似ています (前述の 特殊パラメータ を参照)。${#name[subscript]} は ${name[subscript]} の長さに展開されます。 subscript* または @ の場合は、 配列中の要素数に展開されます。添字無しで配列変数を参照すると、 要素 0 を参照したことになります。

組み込みコマンドの unset は配列の破棄に使われます。unset name[subscript] とすると、インデックスが subscript である配列の要素が破棄されます。 unset name (name は配列) または unset name[subscript] (subscript* または @) とすると、 配列全体が破棄されます。

組み込みコマンドの declare, local, readonly いずれにおいても、 -a オプションで配列を指定できます。組み込みコマンド read では、 -a オプションを使えば標準入力から読み込んだ単語のリストを 配列に代入できます。組み込みコマンド setdeclare では、別の変数への代入に再利用できるような形で配列の値を表示します。

展開

展開はコマンドラインが単語へ分割された後に (コマンドライン上で) 行われます。行われる展開は 7 種類あります: ブレースの展開 (brace expansion), チルダの展開 (tilde expansion), パラメータと変数の展開 (parameter and variable expansion), コマンド置換 (command substitution), 算術式展開 (arithmetic expansion), 単語の分割 (word splitting), パス名の展開 (pathname expansion)

展開の順序は次のようになります: ブレース展開、チルダ展開、パラメータ・ 変数・算術式展開、コマンド置換 (左から右へ)、単語分割、パス名展開。

これらに加えて プロセス置換 (process substitution) をサポートできるシステムもあります。

展開した部分の単語の数が変化することがあるのは、ブレース展開、 単語の分割、パス名展開だけです。他の展開では、 1 つの単語は 1 つの単語に展開されます。 この規則の唯一の例外は先に説明した
"$@" と "${name[@]}" の展開 ( パラメータ を参照) だけです。

ブレース展開

ブレース展開 (brace expansion) を使うと、任意の文字列を生成できます。この機構は パス名展開に似ていますが、 生成されたファイル名が実在する必要はありません。 ブレース展開されるパターンは、 前置部分 (preamble: 省略可能)、 対になるブレースの間にコンマで区切って並べた文字列、 後置部分 (postscript: 省略可能) を順に並べたものです。 前置部分はブレース内にある文字列それぞれの先頭部分に追加され、 後置部分は左から右に順に展開されて得られた それぞれの文字列の末尾に追加されます。

ブレースの展開は入れ子にできます。 展開して得られた文字列はソートされず、 左から右への順番がそのまま残ります。 例えば a{d,c,b}e は `ade ace abe' と展開されます。

ブレースの展開は他のどの展開よりも前に実行されます。 また、他の展開において特殊な意味を持つ文字もそのまま結果に残ります。 つまり、厳密にテキスト操作だけを行います。 bash は、展開の文脈やブレースの間のテキストに対して 文法的な解釈を適用することは一切ありません。

正しい形のブレース展開には、クォートされていない開きブレースと 閉じブレース、また少なくとも 1 つのクォートされていないコンマが 含まれていなければなりません。正しい形でないブレース展開は全て、 変更されないでそのまま残ります。 {, をバックスラッシュでクォートすれば、 ブレース展開の一部と解釈されないようにできます。 パラメータ展開との衝突を避けるため、文字列 ${ はブレース展開の対象とは解釈されません。

この仕組みは、 生成される文字列の共通先頭部分が上記の例より長い場合に、 短縮表現としてよく使用されます:

mkdir /usr/local/src/bash/{old,new,dist,bugs}

あるいは
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}

ブレース展開の導入によって、伝統的な sh とは少し非互換になった部分があります。 sh は単語の一部として開きブレースや閉じブレースが現われても特別扱いはせず、 そのまま出力に残します。 bash はブレース展開の結果として単語からブレースを取り除きます。例えば shfile{1,2} のように入力された単語はそのままの形で出力されますが、 bash ではこの同じ単語は展開されて file1 file2 のように出力されます。 厳密に sh と互換にしたければ、 bash+B オプションを付けて起動するか、 set コマンドに +B オプションを与えてブレース展開を無効にしてください (後述する シェル組み込みコマンド を参照)。

チルダ展開

クォートされていないチルダ (`~') で単語が始まった場合、 クォートされていないスラッシュよりも前にある文字すべて (クォートされていないスラッシュが無ければすべての文字) はチルダプレフィックス (tilde-prefix) と解釈されます。 クォートされている文字がチルダプレフィックス中に無ければ、 チルダプレフィックス中のチルダ以降の文字は、 ログイン名 (login name) になる可能性がある文字列として扱われます。 このログイン名が空文字列ならば、チルダはシェルパラメータ HOME の値に置き換えられます。 HOME が設定されていない場合は、代わりにシェルを実行しているユーザの ホームディレクトリに置き換えられます。 ログイン名が空でなければ、 チルダプレフィックスは指定されたログイン名に対応する ホームディレクトリに置き換えられます。

チルダプレフィックスが `~+' ならば、チルダプレフィックスはシェル変数 PWD の値に置き換えられます。 チルダプレフィックスが `~-' ならば、シェル変数 OLDPWD の値に置き換えられます (値が設定されていれば)。 チルダプレフィックス中のチルダより後の文字が数値 N であれば (数値の前に `+' や `-' を置くこともできます)、 チルダプレフィックスはディレクトリスタック内の対応する要素に置換されます。 置換される要素は、チルダプレフィックスを引き数として組み込みコマンド dirs を実行したときに表示されるものです。 チルダプレフィックスにおけるチルダ以降の文字が、 先行する `+' や `-' のない数値である場合は、`+' であるとみなされます。

ログイン名が有効でない場合や、チルダ展開が失敗した場合には、 単語は置き換えられません。

全ての変数代入において、 := の直後にクォートされていないチルダプレフィックスがないかチェックが行われます。 もし見つかった場合にはこれらもチルダ展開されます。 したがって、 PATH, MAILPATH, CDPATH への代入にチルダを含むファイル名を使えば、 シェルは展開された値を代入します。

パラメータの展開

`$' 文字があると、パラメータ展開、コマンド置換、 算術式展開が行われます。展開されるパラメータ名やシンボルは、 ブレースで括ることもできます。 ブレースは省略可能ですが、 変数の直後に変数名の一部と解釈できる文字が置かれた場合に、 その文字と共に変数が展開されてしまうのを防ぐために用意されています。

ブレースを使った場合、マッチングを終えるブレースは最初の `}' です。 ただしバックスラッシュでエスケープされているものや クォートされている文字列中のものは含まれませんし、 算術式展開やコマンド置換、パラメータ展開に入っているものも含まれません。

${parameter}
parameter の値が置換されます。ブレースが必要になるのは、 parameter が 2 桁以上の数字を持つ位置パラメータの場合や、 parameter の直後の文字を名前の一部として解釈させたくない場合です。

parameter の最初の文字が感嘆符である場合、間接変数レベル (level of variable indirection) という概念が導入されます。 bash は、展開に parameter そのものの値を使用するのでなく、 parameter の感嘆符を除いた残りの文字を変数名として扱い、 その変数の値をその後の展開に使用します。 これが間接展開 (indirect expansion) と呼ばれるものです。 ただし ${!prefix*} の展開は例外です。これは以下で説明します。

以下に示すそれぞれの場合、word に対してチルダ展開、 パラメータ展開、コマンド置換、算術式展開が行われます。 部分文字列展開以外の場合、 bash はパラメータが設定されているか、空ではないかを調べます。 コロンを省略した場合には設定されているかどうかのみを調べます。

${parameter:-word}
デフォルトの値を使いますparameter が設定されていないか空文字列であれば、 word を展開したものに置換されます。そうでなければ、 parameter の値に置換されます。
${parameter:=word}
デフォルトの値を代入しますparameter が設定されていないか空文字列であれば、 word を展開したものが parameter に代入されます。それから parameter の値への置換が行われます。 位置パラメータや特殊パラメータへの代入をこのように行うことはできません。
${parameter:?word}
空文字列または設定されていない場合にエラーを表示しますparameter が空文字列または設定されていない場合、word を展開したもの (word がなければ パラメータが空文字列または設定されていないことを示すメッセージ) が標準エラー出力に出力されます。シェルが対話的でなければ、 シェルは終了します。パラメータに空文字列以外が設定されていれば、 parameter の値への置換が行われます。
${parameter:+word}
別の値を使用しますparameter が空文字列または設定されていなければ、空文字列に置換されます。 そうでなければ word を展開したものに置換されます。
${parameter:offset}
${parameter:offset:length}
部分文字列展開parameter を展開したものから最大 length 文字を取り出します。 先頭の文字は offset で指定します。length を省略すると、 offset で指定した文字を先頭にして、 parameter の残り全部が含まれる部分文字列に展開します。 lengthoffset は算術式です (後述の 算術式評価 を参照)。 length の評価結果は 0 以上の数でなければなりません。 offset を評価すると 0 未満の数になる場合、この値は parameter の値の末尾からのオフセットとして使われます。 parameter@ ならば、結果は offset から始まる length 個の位置パラメータになります。 parameter が @ または * のインデックスが付いている配列名ならば、 結果は配列の ${parameter[offset]} を先頭とする要素 length 個となります。位置パラメータを使う場合以外は、 部分文字列のインデックスは 0 から始まります。位置パラメータの場合には、 インデックスは 1 から始まります。
${!prefix*}
prefix で始まるすべての変数の名前に展開して、 IFS 特殊変数の最初の文字によって区切ります。
${#parameter}
parameter の値に含まれる文字数に置換されます。 parameter* または @ ならば、位置パラメータの数に置換されます。 parameter* または @ が添字になっている配列名ならば、配列中の要素数に置換されます。
${parameter#word}
${parameter##word}
word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが parameter の値の先頭部分とマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン (``#''の場合) または最長一致パターン (``##'' の場合) を取り除いたものになります。 parameter@ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter@ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
${parameter%word}
${parameter%%word}
word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが parameter を展開した値の末尾の部分とマッチする場合、展開結果は parameter を展開した値から最短一致パターン (``%'' の場合) または最長一致パターン (``%%'' の場合) を取り除いたものになります。 parameter@ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter@ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
${parameter/pattern/string}
${parameter//pattern/string}
pattern が展開され、 パス名展開の場合と同じようなパターンを作ります。 parameter の展開が行われ、 その値のうち pattern に最長一致する部分が string に置換されます。 前者の形式の場合には、最初にマッチした部分だけが置換されます。 後者の形式の場合には、マッチした部分は全て string に置換されます。 pattern# で始まる場合には、パターンは parameter を展開した値の先頭にマッチしなければなりません。 pattern% で始まる場合には、パターンは parameter を展開した値の末尾にマッチしなければなりません。 string が空の場合には pattern にマッチした部分は削除されます。 またこの場合には、pattern の後に続く / は省略可能です。 parameter@ または * である場合、置換操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter@ または * が添字になっている配列変数である場合、 置換操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。

コマンド置換

コマンド置換 (command substitution) を用いると、 コマンド名をコマンドの出力で置き換えできます。 コマンド置換には以下の 2 つの形式があります:

$(command)

または
`command`

bash による展開は、command の実行およびコマンド置換の部分を コマンドの標準出力と置換することにより実行されます。 この際、末尾の改行文字は削除されます。 文字列の途中にある改行文字は削除されませんが、 単語分割の際に削除されることがあります。 コマンド置換 $(cat file) は、同じ意味を持ち、 しかも高速な $(< file) に置き換え可能です。

バッククォートを使う古い形式の置換を用いたとき、 バックスラッシュは文字通りの意味を保ちますが、 $, `, \ の前にある場合は例外となります。 バックスラッシュが前置されていないバッククォートがあると、 そこでコマンド置換は閉じられます。 $(command) という形式を用いたときは、 括弧の間にある全ての文字がコマンドとなります。 特別扱いされる文字はありません。

コマンド置換は入れ子にできます。 バッククォート形式の時に入れ子を行うには、 内側のバッククォートをバックスラッシュでエスケープします。

置換がダブルクォート内部にある場合には、 置換の結果に対する単語分割とパス名展開は行われません。

算術式展開

算術式展開を使うと、算術式を評価して、その結果に置換できます。 算術式展開のフォーマットを次に示します:

$((expression))

expression はダブルクォート内部にある場合と同様に扱われますが、 括弧の内側のダブルクォートが特別扱いされることはありません。 式に含まれる全てのトークンに対して、 パラメータ展開・文字列展開・コマンド置換・クォートの削除が行われます。 算術式置換は入れ子にできます。

評価は後述の 算術式評価 で示す規則に基づいて行われます。 expression が不正であれば、 bash は評価の失敗を示すメッセージを出力し、置換を全く行いません。

プロセス置換

プロセス置換 (process substitution) がサポートされるのは、 名前付きパイプ (FIFO) または名前付きオープンファイルの /dev/fd メソッドをサポートしているシステムです。これは <(list) または >(list) の形になります。 プロセス list は、その入力や出力が FIFO または /dev/fd 中の 何らかのファイルに接続された状態で実行されます。 このファイルの名前は、展開の結果として、 引き数のかたちで現在のコマンドに渡されます。 >(list) の形式を使った場合、 ファイルへの書き込みは list への入力となります。 <(list) の形式を使った場合、 引き数として渡されたファイルは list の出力を得るために読み込まれます。

利用可能であれば、プロセス置換 (process substitution) は、 パラメータ展開・変数展開・コマンド置換・算術式展開と同時に行われます。

単語の分割

シェルはパラメータ展開・コマンド置換・算術式展開 (ダブルクォートの内部ではこれらの展開は行われません) の結果をスキャンし、 単語分割 を行います。 シェルは IFS のそれぞれの文字を区切り文字として扱い、 他の展開の結果をこれらの文字によって単語に分割します。 IFS が設定されていないか、その値が正確にデフォルト値の <スペース><タブ><改行> ならば、 IFS 文字の任意の列で単語が区切られます。 IFS がデフォルト以外の値を持っていれば、空白文字 (スペース および タブ) の列は単語の先頭と末尾では無視されます。これは空白文字が IFS の値 ( IFS 空白文字) に含まれる限り成り立ちます。 IFS に含まれ、 IFS 空白文字ではない文字は全て、隣接する任意の IFS 空白文字と一緒になってフィールドの区切りとなります。 IFS 空白文字の列も区切り文字として扱われます。 IFS の値が空文字列であれば、単語分割は全く行われません。

明示的に指定した空の引き数("" または '')は削除されずに残ります。 クォートされていない暗黙的な空の引き数が、 値を持たないパラメータを展開した結果として得られますが、 これらは削除されます。 値を持たないパラメータがダブルクォート内部で展開されると、 これは空である引き数となり、消されずに残ります。

展開が行われなければ単語分割も行われない点に注意してください。

パス名展開

-f オプションが指定されていなければ、単語分割を行った後に bash はそれぞれの単語が *, ?, [ を含んでいるかどうか調べます。 これらの文字のいずれかが見つかると、その単語は パターン と見なされ、 パターンにマッチするファイル名を アルファベット順にソートしたリストに置換されます。 マッチするファイル名が見つからず、かつシェルのオプション nullglob が無効ならば、その単語は変更されずにそのまま残ります。 nullglob オプションが設定されていて、かつマッチするファイル名が見つからなければ、 その単語は削除されます。 シェルのオプション nocaseglob が有効ならば、マッチングにおいてアルファベットの大文字と小文字は区別さ れません。 パターンをパス名展開に使うとき、名前の先頭やスラッシュの直後の ``.'' は明示的にマッチさせなければなりません。ただしシェルのオプション dotglob が設定されている場合は例外です。 パス名のマッチングを行うとき、 スラッシュ文字は必ず明示的にマッチさせなければなりません。 これ以外の場合には、 ``.'' が特別扱いされることはありません。 シェルのオプション nocaseglob, nullglob, dotglob の詳しい説明については、後述の シェルの組み込みコマンド に書かれている shopt の説明を参照してください。

シェル変数 GLOBIGNORE を使って、 パターン にマッチするファイル名の集合を制限できます。 GLOBIGNORE が設定されていれば、マッチするファイル名のうち GLOBIGNORE 中のパターンにもマッチしたものは、 マッチしたもののリストから取り除かれます。 ファイル名 ``.''``..'' は必ず無視されます。これは GLOBIGNORE が設定されていても同じです。しかし、 GLOBIGNORE を設定するとシェルオプションの dotglob が有効になるので、 ``.'' で始まる他のファイル名は全てマッチします。 ``.'' で始めるファイル名を無視する古い動作をさせるには、 ``.*''GLOBIGNORE のパターンに含めてください。 GLOBIGNORE が設定されていなければ、 dotglob オプションは無効になります。

パターンマッチング

パターンに含まれる文字のうち、後述する特殊パターン文字以外の文字は、 自分自身にマッチします。NUL 文字がパターン中に現われてはいけません。 特殊パターン文字をその文字そのものにマッチさせるためには、 クォートしなければなりません。

特殊パターン文字は以下の意味を持っています:

*
空文字列を含む、任意の文字列にマッチします。
?
任意の 1 文字にマッチします。
[...]
括られた文字のうち任意の 1 文字にマッチします。 2 つの文字の間にハイフンを入れたものは、 範囲表現 (range expresion) を表します。ソート順で 2 つの文字の間にある任意の文字と、 両端の 2 文字がマッチします。 ソートには現在のロケールの照合順序 (collating sequance) と文字セットが用いられます。 [ の次の文字が ! または ^ ならば、括られた文字に含まれない任意の文字がマッチします。 範囲表現における文字のソート順は、 現在のロケール (およびシェル変数 LC_COLLATE が指定されていればその値) によって決定されます。 - は、文字集合の最初または最後の文字として含めると マッチングの対象にできます。 ] は、文字集合の最初の文字として含めるとマッチングの対象にできます。

[] の間では、文字クラス (character classes) を指定できます。 指定には [:class:] という記法を使います。ここで class は POSIX.2 標準で定義されている以下のクラスのいずれかです:

alnum alpha ascii blank cntrl digit graph lower print punct space upper xdigit
文字クラスは、そのクラスの属する任意の文字にマッチします。

[] の間では、同値クラス (equivalence class) を指定できます。 指定には [=c=] という記法を使います。 これは現在のロケールにおける定義において c と同じ 照合重さ (collation weight) を持つ全ての文字にマッチします。

[] の間では、[.symbol.] という記述は照合シンボル symbol にマッチします。

組み込みコマンドの shopt を使ってシェルのオプション extglob が有効にされていると、 拡張パターンマッチング演算子がいくつか認識されるようになります。 以下の説明では、pattern-list| で区切られた 1 つ以上のパターンのリストであるものとします。 以下のサブパターンを 1 つあるいは複数使うことにより、 複合パターンを作れます。

?(pattern-list)
与えられたパターンが 0 回または 1 回現われるとマッチします。
*(pattern-list)
与えられたパターンが 0 回以上現われるとマッチします。
+(pattern-list)
与えられたパターンが 1 回以上現われるとマッチします。
@(pattern-list)
与えられたパターンのうち 1 つだけにマッチします。
!(pattern-list)
与えられたパターンいずれにも含まれないもの全てにマッチします。

クォートの削除

先に処理される展開の後、クォートされていない \, ', " のうち、先の展開の結果でないものは全て削除されます。

リダイレクト

シェルが解釈する特別な記法を用いると、コマンドの実行前に入出力を リダイレクト できます。またリダイレクトを使うと、 現在のシェル実行環境に対してファイルをオープンしたり クローズしたりできます。以下に示すリダイレクト演算子は、 単純なコマンド の前や途中に置くことができ、また コマンド の後に置けます。 リダイレクトは左から右へと、現われた順に処理されます。

以下の説明においては、ファイル・ディスクリプター番号が省略され、 かつリダイレクト演算子の最初の文字が < ならば、リダイレクトは標準入力 (ファイル・ディスクリプター 0) を参照します。 リダイレクト演算子の最初の文字が > ならば、リダイレクトは標準出力 (ファイル・ディスクリプター 1) を参照します。

以下の説明では、リダイレクト演算子の次の単語に対しては、 特に説明しない限り、 ブレース展開・チルダ展開・パラメータ展開・コマンド置換・ 算術式展開・クォート削除・パス名展開・単語分割が行われます。 ある単語が複数の単語に展開された場合はエラーになります。

リダイレクトの順番には意味がある点に注意してください。 例えば、次のコマンド

ls > dirlist 2>&1

は標準出力と標準エラー出力を両方ともファイル dirlist に書き込みますが、次のコマンド

ls 2>&1 > dirlist

では標準出力だけがファイル dirlist に書き込まれます。なぜなら後者の場合には、標準エラー出力は dirlist にリダイレクトされる前の標準出力の複製となるからです。

bash は、 以下の表にあるようなファイル名がリダイレクトに使用されると、 それらを特別に扱います。

/dev/fd/fd
fd が有効な整数ならばファイル・ディスクリプター fd が複製されます。
/dev/stdin
ファイル・ディスクリプター 0 が複製されます。
/dev/stdout
ファイル・ディスクリプター 1 が複製されます。
/dev/stderr
ファイル・ディスクリプター 2 が複製されます。
/dev/tcp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して TCP 接続のオープンを試みます。
/dev/udp/host/port
host が有効なホスト名またはインターネットアドレスで port が整数のポート番号ならば、 bash は対応するソケットに対して UDP 接続のオープンを試みます。

ファイルのオープンや作成に失敗すると、リダイレクトも失敗します。

入力のリダイレクト

入力をリダイレクトすると、 word を展開した結果の名前を持つファイルがオープンされ、ファイル・ディスクリプター n で読み込めるようになります。 n が指定されていなければ、読み込みは標準入力 (ファイル・ディスクリプター 0) で行われます。

入力のリダイレクトは、一般的には以下の形式です:

[n]<word

出力のリダイレクト

出力をリダイレクトすると、 word の展開した結果の名前を持つファイルがオープンされ、ファイル・ディスクリプター n で書き込めるようになります。 n が指定されていなければ、書きこみは標準出力 (ファイル・ディスクリプター 1) に行われます。 ファイルが存在しなかった場合は作成されます。 ファイルが存在した場合はサイズ 0 に切り詰められます。

出力のリダイレクトは、一般的には以下の形式です:

[n]>word

リダイレクト演算子が > であり、かつ noclobber オプションが組み込みコマンド set に対して設定されている場合、word の展開で得たファイルが存在し、 かつそれが通常ファイルならば、リダイレクトは失敗します。 リダイレクト演算子が >| の場合や、 リダイレクト演算子が > で組み込みコマンド set に対する noclobber オプションが設定されていない場合、 word という名前のファイルが存在していてもリダイレクトが試みられます。

リダイレクトによる追加出力

この形式を使って出力のリダイレクトを行うと、 word を展開した結果の名前を持つファイルがオープンされ、ファイル・ディスクリプター n に対する出力がこのファイルに追加されるようになります。 n を指定しなければ、標準出力 (ファイル・ディスクリプター 1) で追加されます。 ファイルが存在しなければ、新しく作られます。

追加出力は一般的には以下の形式です:

[n]>>word

標準出力と標準エラー出力のリダイレクト

この構造を使うと、 標準出力 (ファイル・ディスクリプター 1) と標準エラー出力 (ファイル・ディスクリプター 2) の両方を、 word を展開した結果の名前を持つファイルにリダイレクトできます。

標準出力と標準エラー出力に対する形式は 2 つあります:

&>word

および
>&word

両者のうち望ましいのは前者の方です。これは次のものと同じ意味です:

>word 2>&1

ヒアドキュメント(Here Documents)

この形式のリダイレクトを用いると、 シェルは現在のソースから入力を読み込みます。 この読み込みは word を単独で含む行 (末尾にブランク文字があってはいけません) が現われるまで続きます。 その行までに読み込んだ行は、 コマンドの標準入力として扱われます。

ヒアドキュメントの形式を以下に示します:

<<[-]word

here-document delimiter

word に対するパラメータ展開・コマンド置換・算術式展開・ パス名展開は全く行われません。 word が一部でもクォートされている場合は、 delimiterword のクォートをほどいた結果 (クォート文字を削除した結果) となり、 ヒアドキュメントに含まれる行では展開が行われなくなります。 word がクォートされていなければ、 ヒアドキュメント中の全ての行に対して パラメータ展開・コマンド置換・算術式展開が行われます。 後者の場合には \<newline> という文字列は無視されます (出力から取り除かれます)。 また \, $, ` といった文字は \ を用いてクォートしなければなりません。

リダイレクト演算子が <<- ならば、行頭にあるタブ文字は全て入力行および delimiter を含む行から取り除かれます。 これにより、シェルスクリプト中のヒアドキュメントを 自然な形でインデントさせることができます。

ファイル・ディスクリプターの複製

リダイレクト演算子

[n]<&word

を使うと入力ファイル・ディスクリプターを複製できます。 word が 1 桁以上の数値に展開された場合、 n で示されるファイル・ディスクリプターが生成され、 そのファイル・ディスクリプターのコピーとなります。 word に含まれる数値が入力のためにオープンされたファイル・ディスクリプターを 指していない場合、リダイレクト・エラーが起きます。 word を評価した結果が - となった場合、ファイル・ディスクリプター n はクローズされます。 n が指定されていない場合、標準入力 (ファイル・ディスクリプター 0) が使われます。

同様に、演算子

[n]>&word

を使って出力ファイル・ディスクリプターを複製できます。 n が指定されていない場合は、標準出力 (ファイル・ディスクリプター 1) が使われます。 word に含まれる数値が、出力のためにオープンされた ファイル・ディスクリプターを指していない場合、 リダイレクト・エラーが起きます。特別な場合ですが、 n が省略され、かつ word が 1 桁以上の数字には展開されなかった場合、 前に説明したように標準出力と標準エラー出力がリダイレクトされます。

読み書きのためのファイル・ディスクリプターのオープン

リダイレクト演算子が

[n]<>word

ならば、 word を展開した結果の名前を持つファイルがファイル・ディスクリプター n での読み書きのためにオープンされます。 n が指定されていなければ、 ファイル・ディスクリプター 0 で読み書きが行われます。 ファイルが存在しなければ、新しく生成されます。

エイリアス

エイリアス(alias) を使うと、 ある単語が単純なコマンドの先頭の単語として使われた場合に、 この文字列を別の単語に置換できます。 シェルはエイリアスのリストを管理しています。 このリストは組み込みコマンドの aliasunalias を使って設定および設定の取り消しできます (後述の シェルの組み込みコマンド を参照)。 各コマンドの最初の単語がクォートされていない場合、 エイリアスかどうかが確認され、 エイリアスならばその単語はそのエイリアスのテキストと置換されます。 エイリアス名と置換されるテキストには、 シェルの入力として有効なものは何でも含めることができます。 これには先に挙げた メタ文字 も含まれますが、 例外としてエイリアス名に = を含めることはできません。 置換されるテキストの最初の単語に対しても エイリアスかどうかの評価がされますが、 最初の単語が展開されるエイリアスと同じ場合には 展開は 1度しか行われません。つまり lsls -F のエイリアスとなっているような場合には、 bash は置換される文字列を再帰的に展開することはありません。 エイリアスの値の最後の文字が ブランク文字 の場合、エイリアスに続く次のコマンドの単語に対しても エイリアス展開が試みられます。

エイリアスは alias コマンドで作成とリスト表示を行い、 unalias コマンドで削除します。

置換されるテキストに引き数を入れる仕組みはありません。 引き数が必要ならば、シェル関数を使わなければなりません (後述の 関数 を参照)

シェルが対話的でない時には、 shopt コマンドによって expand_aliases オプションが設定されていない場合に限り、 エイリアスの展開は行われません (後述の シェルの組み込みコマンド における shopt の説明を参照)。

エイリアスの定義や利用に関係する規則には、紛らわしい点があります。 bash は、ある行に書かれているコマンドを実行する前に必ず、 少なくとも 1 回は行全体を読み込みます。 エイリアスが展開されるのはコマンドを読み込んだ時であり、 実行する時ではありません。 したがって、別のコマンドと同じ行でエイリアス定義を行った場合には、 次の入力行が読み込まれるまではエイリアスの効果は現われません。 同じ行にあるエイリアス定義の後のコマンドは、 新しいエイリアスの影響を受けません。 この動作は関数を実行する場合にも問題になります。 エイリアスが展開されるのは関数定義が読み込まれる時であり、 関数が実行される時ではありません。 なぜなら、関数定義自身も複合コマンドだからです。 その結果として、関数内で定義されたエイリアスは、 その関数が実行されるまでは利用できません。 安全のため、エイリアス定義は独立した行で行うべきです。 複合コマンド内で alias を使ってはいけません。

ほとんど全ての用途において、 シェル関数でエイリアスを代用できます。

関数

シェル関数は、後で使うために一連のコマンドを保存するものです。 シェル関数の定義は既に シェルの文法 で説明しています。 シェル関数名が単純なコマンド名として使われた場合、 関数名に対応するコマンド群が実行されます。 関数は現在のシェルのコンテキスト内で実行されます。 つまり、新しいプロセスを生成して関数を処理することはありません (これはシェルスクリプトと対照的な点です)。 関数の実行中には、関数に与えた引き数が位置パラメータとなります。 特殊パラメータ # は更新され、この変更が反映されます。 位置パラメータ 0 は変わりません。 関数の実行中は FUNCNAME 変数に関数の名前が設定されます。 シェル実行環境の状態は全て、関数とその呼び出し側で同じになりますが、 例外として DEBUG トラップ (後述の シェルの組み込みコマンド の項で、組み込みコマンド trap の説明を参照) は継承されません。

関数ローカルの変数は、組み込みコマンド local で宣言できます。 普通は、変数とその値は関数とその呼び出し側で共有されます。

組み込みコマンド return が関数中で実行された場合、関数は終了し、 関数呼び出しの次のコマンドから実行が再開されます。 関数の終了時には、位置パラメータの値と特殊パラメータ # の値は、関数の実行前の値に戻ります。

関数の名前と定義をリスト表示するには、組み込みコマンドの declaretypeset を、オプション -f を付けて実行します。 declaretypeset をオプション -F で実行すると、関数名だけがリスト表示されます。 関数をエクスポートして、 サブシェルでその関数が自動的に定義されている状態にできます。 これを行うには、組み込みコマンドの export-f オプションを付けて実行します。

関数は再帰させることができます。 再帰呼び出しの回数には制限はありません。

算術式評価

シェルにおいては、特定の状況下で算術式を評価させることができます (組み込みコマンドの let算術式展開 を参照)。 評価は long 型の整数として行われ、 オーバーフローのチェックは行われません。 ただし、0 での除算はトラップされ、エラーとしてのフラグが立てられます。 演算子とその優先度、結合規則は C 言語と同じです。 以下のリストは、 同じ優先度を持つ演算子をグループとしてまとめて列挙したものです。 優先度の高いものから順に列挙しています。

変数を評価し、その後 increment (加算)/ decrement (減算) する。
++id --id
変数を increment (加算) / decrement (減算) してから評価する。
- +
単項式の負と正
! ~
論理的否定とビット単位の否定
**
指数 (累乗)
* / %
乗算、除算、剰余
+ -
加算と減算
<< >>
左ビットシフトと右ビットシフト
<= >= < >
比較
== !=
等値と非等値
&
ビット単位の AND
^
ビット単位の排他的 OR
|
ビット単位の OR
&&
論理的 AND
||
論理的 OR
条件付き実行
= *= /= %= += -= <<= >>= &= ^= |=
代入
コンマ

シェル変数をオペランドにすることもできます。 パラメータ展開は式の評価より前に行われます。 式の中では、パラメータの値は long 型の整数に強制的に変換されます。 式の中では、シェル変数を (パラメータ展開規則を用いずに) 変数名で参照できます。 変数の値は変数が参照された際に算術式として評価されます。 式で用いるためにシェル変数の整数属性を有効にする必要はありません。

先頭が 0 である定数は 8 進数として解釈されます。 先頭が 0x または 0X ならば 16 進数として解釈されます。 それ以外の場合には、数値は [base#]n の形式で表します。ここで base は 2 から 64 の間の 10 進数であり、算術的な意味での基数を表します。 n はその基数における数を表します。 ある桁において 9 より大きい数字を表すには文字を使います。 文字を使う場合には、アルファベット小文字、大文字、_, @ をこの順番で使います。 base が 36 以下の場合には、大文字と小文字は区別されず、 大文字と小文字のどちらを使っても 10 から 35 までの数字を表現できます。

演算子は優先度の順に評価されます。括弧内にある部分式は最初に評価され、 前述の優先規則よりも優先させることができます。

条件式

条件式は複合コマンド [[ と組み込みコマンドの test および [ によって使用でき、ファイルの属性を調べたり、 文字列比較や算術式比較を行ったりできます。 式は以下に示す単項のプライマリや二値のプライマリから構成されます。 プライマリのいずれかに対する file 引き数が /dev/fd/n という形式ならば、 ファイル・ディスクリプター n が調べられます。 プライマリのいずれかに対する file 引き数が /dev/stdin/dev/stdout/dev/stderr のいずれかであれば、 対応するファイル・ディスクリプターが調べられます。 ( /dev/stdin/dev/stdout/dev/stderr に対応する ファイル・ディスクリプターはそれぞれ 0、1、2 です。)

-a file
file が存在すれば真となります。
-b file
file が存在し、かつブロック特殊ファイルならば真となります。
-c file
file が存在し、かつキャラクタ特殊ファイルならば真となります。
-d file
file が存在し、かつディレクトリならば真となります。
-e file
file が存在すれば真となります。
-f file
file が存在し、かつ通常ファイルならば真となります。
-g file
file が存在し、かつ set-group-id されていれば真となります。
-h file
file が存在し、かつシンボリックリンクならば真となります。
-k file
file が存在し、かつ ``sticky'' ビットが設定されていれば真となります。
-p file
file が存在し、かつ名前付きパイプ (FIFO) ならば真となります。
-r file
file が存在し、かつ読み込み可能ならば真となります。
-s file
file が存在し、かつそのサイズが 0 より大きければ真となります。
-t fd
ファイル・ディスクリプター fd がオープンされており、かつ端末を参照していれば真となります。
-u file
file が存在し、 かつ set-user-id ビットが設定されていれば真となります。
-w file
file が存在し、かつ書き込み可能ならば真となります。
-x file
file が存在し、かつ実行可能ならば真となります。
file が存在し、かつ (実行中のシェルの) 実効ユーザ ID に所有されていれば真となります。
file が存在し、かつ (実行中のシェルの) 実効グループ ID に所有されていれば真となります。
file が存在し、かつシンボリックリンクならば真となります。
-S file
file が存在し、かつソケットならば真となります。
file が存在し、 かつ前回読み込まれた後に修正されていれば真となります。
file1 が (変更日時に関して) file2 より新しければ真となります。
file1file2 より古ければ真となります。
file1file2 とで デバイス番号と i-ノード番号が同じならば真となります。
-o optname
シェルオプション optname が有効ならば真となります。後述する組み込みコマンド set に対するオプションの説明中にあるオプション一覧を参照してください。
string の長さが 0 ならば真となります。
-n string
string の長さが 0 でなければ真となります。
文字列が同じならば真となります。== の代わりに = も使えます。
2 つの文字列が異なれば真となります。
現在のロケールにおいて、string1string2 よりも 辞書順で前にある場合に真となります。
現在のロケールにおいて、string1string2 よりも 辞書順で後にある場合に真となります。
OP-eq, -ne, -lt, -le, -gt, -ge のいずれかです。 これらの二値演算子が真を返すのはそれぞれ、 arg1arg2 に対して等しい場合、 等しくない場合、小さい場合、小さいか等しい場合、大きい場合、 大きいか等しい場合です。 arg1arg2 には、正または負の整数を使用できます。

単純なコマンドの展開

単純なコマンドを実行すると、シェルは以下に示す展開、代入、 リダイレクションを左から右の順で実行します。

1.
パーザが変数代入 (コマンド名の前にあるもの) またはリダイレクションと判断した単語は、 保存されて後で処理されます。
2.
変数代入でもリダイレクションでもない単語が展開されます。 もし展開の後に残っている単語があれば、 その最初の単語がコマンド名となり、残りが引き数となります。
3.
リダイレクションが前述の リダイレクション で説明したように実行されます。
4.
変数代入の = の後にあるテキストに対して、チルダ展開、 パラメータ展開、コマンド置換、算術式展開、クォート削除が行われます。 この処理は変数を代入する前に行われます。

コマンド名が残らなかった場合には、 変数を代入した結果が現在のシェル環境に効果を及ぼします。 そうでない場合、変数は実行されるコマンドの環境に追加されるだけで、 現在のシェル環境には影響を与えません。 読み込み専用の変数に対して代入をしようとするとエラーが発生し、 そのコマンドは 0 でないステータスで終了します。

コマンド名が残らなかった場合、リダイレクションは行われますが、 現在のシェル環境は影響を受けません。 リダイレクションのエラーが起きると、 コマンドは 0 でないステータスで終了します。

展開の後にコマンド名が残っている場合、後述するように実行が進行します。 そうでない場合はコマンドは終了します。 展開のいずれかがコマンド置換である場合には、 コマンドの終了ステータスは 最後に実行されたコマンド置換の終了ステータスになります。 コマンド置換が行われなかった場合には、 コマンドはステータス 0 で終了します。

コマンドの実行

コマンドが単語に分割された後に、 単純なコマンドとそれに対する引き数リスト (引き数リストは省略可能) となった場合、以下の動作が行われます。

コマンド名にスラッシュが含まれない場合、 シェルはコマンドの位置を特定しようとします。 その名前のシェル関数が存在すれば、前に 関数 で説明したようにその関数が呼び出されます。 名前が関数にマッチしない場合には、 シェルはシェルの組み込みコマンドのリストを探します。 マッチするものがあった場合、その組み込みコマンドが呼び出されます。

名前がシェル関数も組み込みコマンドでなく、 かつスラッシュを含まない場合には、 bashPATH の各要素を検索し、その名前の実行ファイルを含むディレクトリを探します。 bash はハッシュ表を使って実行ファイルの完全なパス名を記憶します (後述の シェルの組み込みコマンドhash の項を参照)。 PATH に含まれるディレクトリの完全な探索は、 そのコマンドがハッシュ表の中に無い場合にのみ行われます。 検索にも失敗すると、シェルはエラーメッセージを出力し、 終了ステータス 127 を返します。

検索に成功したか、コマンド名に 1 つ以上のスラッシュが含まれる場合には、 シェルは指定されたプログラムを独立した実行環境で実行します。 引き数 0 には指定された名前が設定され、 コマンドに対する残りの引き数には (もしあれば) 指定された引き数が設定されます。

このファイルが実行可能フォーマットでないために実行が失敗し、 かつディレクトリでもない場合には、 このファイルは シェルスクリプト(shell script)であると見なされます。 シェルスクリプトとは、シェルのコマンドが書かれているファイルのことです。 シェルスクリプトを実行するためにサブシェルが呼び出されます。 このサブシェルは自分自身を再初期化し、 シェルスクリプトを処理するために 新しいシェルが起動されたかのような結果になります。ただし、 親が記憶しているコマンドの位置 (後述の シェルの組み込みコマンド における hash の項を参照) は子にも引き継がれます。

プログラムが #! で始まるファイルである場合、 最初の行の残りの部分はこのプログラムのインタプリタを指定します。 シェルは指定されたインタプリタをオペレーティングシステム上で実行します。 オペレーティングシステムは、この実行可能フォーマットを直接処理しません。 インタプリタに対する引き数は、 プログラムの先頭の行のインタプリタ名の後の省略可能な引き数 1 つと、 その後のプログラム名、さらに (もしあれば) その後のコマンドへの引き数から構成されます。

コマンド実行環境

シェルは以下の要素からなる実行環境(execution environment)を持ちます:

  • 起動時にそのシェルが継承したオープンされているファイル。 これは組み込みコマンド exec に与えられている リダイレクション機能で変更されます。
  • 現在の作業ディレクトリ (current working directory)。これは cd, pushd, popd で設定するか、 あるいは起動時にそのシェルが継承します。
  • ファイル作成モードのマスク。 これは umask で設定するか、あるいはそのシェルの親から継承します。
  • trap で設定された現在のトラップ。
  • シェルのパラメータ。これは変数の代入か set で設定されるか、 あるいはその環境内にある親シェルから継承します。
  • 実行中に定義されるか、その環境内にある親シェルから継承したシェル関数。
  • 起動時に有効にしたか (デフォルト値あるいはコマンドライン引き数で設定した値)、 set で有効にしたオプション。
  • shopt で有効にしたオプション。
  • alias で定義したシェルエイリアス。
  • 各種プロセスID。これにはバックグラウンドジョブや $$ の値、 $PPID の値が含まれます。

組み込みコマンドやシェル関数を除く単純なコマンドを実行するとき、 このコマンドは独立した実行環境内で呼び出されます。 この環境は以下の要素から成り立っています。 特に断らない限り、この値はシェルから引き継がれます。

  • シェルのオープンしているファイルと、 コマンドに対するリダイレクションで指定した変更・追加をこれに加えたもの。
  • 現在の作業ディレクトリ
  • ファイル作成モードのマスク
  • エクスポートするシェル変数と、 そのコマンドに対してエクスポートされた変数。 これらは環境で渡されます。
  • シェルが捕捉したトラップは、 そのシェルの親から継承された値に再設定されます。 そのシェルが無視したトラップは無視されます。

この独立の環境内で呼び出されたコマンドが、 (親である) シェルの実行環境に影響を及ぼすことはできません。

コマンド置換と非同期コマンドは、サブシェル環境内で呼び出されます。 このサブシェル環境はシェル環境を複製したものです。ただし、 シェルが捕捉したトラップは、 そのシェルの起動時に親から継承した値に再設定されます。 パイプラインの一部として起動された組み込みコマンドは、 サブシェル環境で実行されます。サブシェル環境に対して行われた変更は、 元のシェル実行環境に影響を及ぼすことはできません。

環境

プログラムの起動時には、 環境 (environment) と呼ばれる文字列の配列が渡されます。 これは 変数名- のペアからなるリストで、 変数名=値 という形になります。

シェルは、環境を操作する様々な方法を提供しています。 起動時には、シェルは自分自身の環境を調べ、 見つかった名前それぞれに対してパラメータを生成し、 それに自動的に印を付けて子プロセスに エクスポート (export) します。実行されたコマンドは環境を継承します。 export コマンドまたは declare -x コマンドを用いると、 パラメータや関数の追加と削除を環境に対して行えます。 環境内のパラメータの値が変更されると、 新しい値は環境の一部となり、古い値と置き換わります。 実行されたコマンドが継承する環境は、 シェルの最初の環境から、 変数の値がシェル中で変更されたり、 一部のペアが unset コマンドで削除されたり、 export コマンドや declare -x コマンドで追加されたりしたものになります。

単純なコマンド や関数に対する環境は、一時的に修正できます。 これは、既に パラメータ の項で説明したように、パラメータ代入を前に置くことで行います。 このような代入が影響を与えるのは、 そのコマンドが参照する環境だけです。

-k オプションを設定 (後述の組み込みコマンド set を参照) すると、コマンド名の前に置いたものだけではなく、 全ての パラメータ代入がそのコマンドの環境に影響を与えます。

bash が外部コマンドを起動したときには、変数 _ にはコマンドの完全なファイル名が設定され、 環境変数としてそのコマンドに渡されます。

終了ステータス

シェルは、終了コード 0 で終了したコマンドは正常終了したとみなします。 終了コード 0 は成功を示します。 0 以外の終了コードは失敗を示します。 あるコマンドが致命的なシグナル N で終了したときには、 bash は「128+N」の値を終了ステータスに使います。

コマンドが見つからなかった場合には、 そのコマンドを実行するために生成された子プロセスが ステータス 127 を返します。 コマンドが見つかったけれど実行できなかった場合には、 返却ステータスは 126 です。

展開やリダイレクションの際のエラーのために コマンドが失敗した場合には、 0 より大きい終了ステータスが返されます。

シェルの組み込みコマンドは、 成功した場合にはステータス 0 () を返し、 実行中にエラーが起こった場合には 0 でない値 () を返します。

bash 自身が返す終了ステータスは、文法エラーが起きなければ、 実行した最後のコマンドの終了ステータスです。 文法エラーの場合には 0 でない値が終了ステータスとなります。 後述の組み込みコマンド exit も参照してください。

シグナル

bash が対話的であり、トラップが全く無いとき、bashSIGTERM を無視し (したがって kill 0 では対話シェルは kill されません)、 SIGINT を捕捉、処理します (したがって組み込みコマンド wait は割り込み可能です)。 どんな場合でも、bashSIGQUIT を無視します。 ジョブ制御が有効な状態ならば、 bashSIGTTIN, SIGTTOU, SIGTSTP を無視します。

bash が起動した同期ジョブは、 シェルが自分の親から継承した値をシグナルハンドラに設定します。 ジョブ制御が有効でないときには、非同期コマンドは SIGINTSIGQUIT も無視します。 コマンド置換の結果として実行されたコマンドは、 キーボードで生成されたジョブ制御シグナルを無視します。 無視されるシグナルは SIGTTIN, SIGTTOU, SIGTSTP です。

デフォルトでは、シェルは SIGHUP を受け取ると終了します。 終了する前には、シェルは実行中・停止中の全てのジョブに対して SIGHUP を再送信します。停止しているジョブには SIGCONT が送られ、このジョブが SIGHUP を受け取るようにします。 特定のジョブに対してシェルからシグナルが送られないようにするためには、 組み込みコマンド disown (後述の シェルの組み込みコマンド を参照) を使って、そのジョブをジョブテーブルから削除するか、あるいは disown -h を使って、 SIGHUP を受け取らないようにマークを付けます。

シェルオプションの huponexitshopt を使って設定された場合、対話的なログインシェルが終了するときに、 bashSIGHUP を全てのジョブに送ります。

コマンドの完了を待っている間に、トラップが設定されたシグナルを bash が受け取ったとき、 そのトラップはコマンドが完了するまで実行されません。 bash が組み込みコマンドの wait を使って非同期コマンドを待っている時に、 トラップが設定されているシグナルを受け取ると、 組み込みコマンド wait は即座に復帰させられます。 この際の終了ステータスは 128 より大きい値になります。 また復帰するのはトラップが実行された直後です。

ジョブ制御

ジョブ制御(job control) とは、プロセスの実行を選択的に停止 (サスペンド/suspend) させ、 後に再び実行を続けさせる (リジューム/resume) 機能のことです。 ユーザは通常、システムの端末ドライバと bash を組み合わせて使い、対話的インタフェースを通してこの機能を利用します。

シェルはパイプラインごとに ジョブ(job) を構成します。シェルは現在実行中のジョブのテーブルを保存しています。 このテーブルは jobs コマンドを使ってリスト表示できます。 bash がジョブを非同期的に (バックグラウンド で) 起動したときには、 bash は以下のような行を出力します:

[1] 25647

これは、このジョブのジョブ番号は 1 であり、 このジョブを構成するパイプライン中の最後のプロセスの ID が 25647 であることを示しています。 1 つのパイプラインに含まれる全てのプロセスは同じジョブのメンバです。 bash は、ジョブ制御の基礎として ジョブ という抽象化機構を使います。

ジョブ制御のためのユーザインタフェースの実装を容易にするために オペレーティングシステムは 現在の端末プロセスのグループ ID (current terminal process group ID) という情報を管理しています。 このプロセスグループのメンバ (プロセスグループ ID が現在の端末プロセスのグループ ID と等しいプロセス) は、 SIGINT のような、キーボードで生成されたシグナルを受け取ります。 このようなプロセスは フォアグラウンド (foreground) にあると言われます。 バックグラウンド (background) プロセスは、 プロセスのグループ ID が端末のグループ ID と異なるプロセスです。 このようなプロセスは、キーボードで生成したシグナルの影響を受けません。 端末への読み書きが許されるのはフォアグラウンドプロセスだけです。 バックグラウンドプロセスが端末からの読み込み (端末への書き込み) を行おうとすると、 このプロセスには端末ドライバから SIGTTIN (SIGTTOU) シグナルが送られます。 このシグナルを捕捉しなければ、プロセスは停止します。

bash を動かしているオペレーティングシステムがジョブ制御をサポートしているならば、 ユーザは bash を使ってジョブ制御を行えます。 プロセスの動作中に サスペンド 文字(通常は ^Z, Control-Z) を打ち込むと、そのプロセスは停止させられ、 bash に制御が戻ります。 遅延サスペンド (delayed suspend) 文字 (通常は ^Y, Control-Y) を打ち込むと、 そのプロセスは端末から入力を読み込もうとしたときに停止させられ、 制御が bash に戻ります。 このときユーザはこのジョブの状態を操作できます。 利用できるのは、バックグラウンドで実行を継続するならば bg コマンド、フォアグラウンドで実行を継続するならば fg コマンド、プロセスを kill するなら kill コマンドです。^Z の効果は即座に現われるので、 未出力の出力や先行入力した文字が破棄されるという副作用があります。

シェル上でジョブを参照する方法は色々あります。文字 % はジョブ名の始まりを示します。ジョブ番号 n%n として参照できます。 ジョブの参照には、 ジョブを起動する時に使った名前の先頭部分や コマンドライン中に現われる部分文字列を使うこともできます。 例えば、 %ce は停止しているジョブ ce を指します。先頭の部分がマッチするジョブが複数個ある場合には、 bash はエラーを報告します。一方、 %?ce を用いると、文字列 ce をコマンドライン中に含む任意のジョブを参照できます。 部分文字列がマッチするジョブが複数個ある場合には、 bash はエラーを報告します。シンボル %% および %+ は、シェルが覚えている カレントジョブ (current job) を指します。これは、フォアグラウンドで起動されている時に停止されたか、 バックグラウンドで起動された最後のジョブです。 前のジョブ (previous job)%- を使って参照できます。jobs コマンドの出力においては、 カレントジョブには必ず + というフラグが付き、前のジョブには - というフラグが付きます。

単にジョブを呼べば、 そのジョブをフォアグラウンドに持ってきます。つまり、 %1``fg %1'' と同義であり、 ジョブ 1 をバックグラウンドからフォアウグラウンドに持ってきます。 同様に ``%1 &'' はジョブ 1 をバックグラウンドで実行再開させます。これは ``bg %1'' と同じ意味です。

ジョブの状態が変わると、シェルはそれを即座に知ります。 bash がジョブの状態変化を報告するのは通常、プロンプトを出力する直前です。 これは他の出力を妨害しないためです。組み込みコマンド set-b オプションが指定されていると、 bash はこのような変化を即座に報告します。

ジョブを停止させたままで bash を終了 (exit) させようとすると、シェルは警告メッセージを出力します。 このような時には、 jobs コマンドを使ってジョブの状態を調べられます。 間にコマンドを挟まずに bash を再び終了させようとすると、 シェルは警告を繰り返さないで、 停止されているジョブを終了させます。

プロンプト

対話的に動作している場合、 bash はコマンドを読む込み準備ができた時にプライマリプロンプト PS1 を表示し、コマンドを完成させるためにまだ入力が必要な時に セカンダリプロンプト PS2 を表示します。 bash ではこれらのプロンプト文字列をカスタマイズできます。 この際にはバックスラッシュでエスケープされた 各種特殊文字を挿入でき、 これは以下のようにデコードされます:

ASCII のベル文字 (07)
"曜日 月 日" という形式の日付 (例: "Tue May 26")
ASCII のエスケープ文字 (033)
ホスト名のうち最初の `.' までの部分
ホスト名
シェルによって現在管理されているジョブの数
シェルの端末デバイスのベース名 (basename)
改行
復帰
シェルの名前。つまり $0 のベース名 (最後のスラッシュ以降の部分)
24 時間の HH:MM:SS 形式の現在の時刻
12 時間の HH:MM:SS 形式の現在の時刻
\@
12 時間の HH:MM am/pm 形式の現在の時刻
現在のユーザのユーザ名
bash のバージョン (例: 2.00)
bash のリリース。バージョンにパッチレベルを加えたもの (例 : 2.00.0)
現在の作業ディレクトリ
現在の作業ディレクトリのベース名
\!
このコマンドの履歴番号
\#
このコマンドのコマンド番号
\$
実効 UID が 0 の場合に #、 それ以外の場合は $
8進数 nnn に対応する文字
\\
バックスラッシュ
\[
非表示文字のシーケンスの開始。 これを使うと、プロンプト中に端末の制御シーケンスを埋め込むことができます。
\]
非表示文字のシーケンスを終了します。

コマンド番号と履歴番号は異なるのが普通です: コマンドの履歴番号とは履歴リスト内での位置です。 履歴リストは履歴ファイルから読み込めます。 (後述の 履歴 を参照) 一方コマンド番号は、 現在のシェルのセッション中に実行された一連のコマンドの列における位置です。 この文字列がデコードされた後、さらにパラメータ展開、コマンド置換、 算術式展開、クォート削除が適用されます。展開はシェルオプション promptvars (後述の シェルの組み込みコマンド の項にある shopt コマンドの説明を参照) の値に基づいて行われます。

READLINE ライブラリ

readline は対話シェルを使うときに入力の読み込みを処理するライブラリです。 ただし、シェルの起動時に --noediting オプションが指定された場合には使われません。 デフォルトでは、行編集に使うコマンドは emacs のコマンドに似ています。 vi 形式の行編集インタフェースも使えます。 シェルを起動した後に行編集機能を無効にするには、組み込みコマンド set (後述の シェルの組み込みコマンド を参照) に対して +o emacs オプションまたは +o vi オプションを設定してください。

Readline セクションにおける記法

このセクションでは、emacs 形式の記法を使ってキーストロークを表します。 コントロールキーは C-key で表します (例: C-n は Control-N の意味です)。同様に メタ キーは M-key で表すので、M-x は Meta-X を表すことになります。 (メタ キーが無いキーボードでは、M-x は ESC x を表します。つまり、 エスケープキーを押した後に x キーを押します。これは ESC を メタプレフィックス (meta prefix) にする操作です。 M-C-x の組み合わせは、ESC-Control-x あるいはエスケープキーを押した後に、コントロールキーを押したまま x を押すことを示します。)

Readline のコマンドには数値の 引き数 を指定できます。通常これは繰り返しの回数として作用します。 ただし場合によっては、引き数の符号が意味を持つこともあります。 前方に作用するコマンド (例: kill-line) に負の引き数を渡すと、 コマンドは後方に作用します。 引き数に対する動作がこの説明と異なるコマンドについては後で説明します。

コマンドがテキストをキル (kill) すると説明されている時は、 削除されたテキストは、 後で取り出せる (ヤンク (yank) できる) ように保存されます。 キルされたテキストは、キルリング (kill ring) に保存されます。 連続してキルを行うと、テキストは 1 つのまとまりとして保存されるので、 全部を一度にヤンクできます。テキストをキルしないコマンドが挟まると、 キルリング上のテキストが分離されます。

Readline の初期化

コマンドを初期化ファイル (inputrc ファイル) に追加すると、 readline をカスタマイズできます。このファイルの名前は、変数 INPUTRC の値から決まります。この変数が設定されていない場合のデフォルト値は ~/.inputrc です。 readline ライブラリを使うプログラムが起動する際には、 この初期化ファイルが読み込まれ、キー割り当てと変数が設定されます。 readline の初期化ファイル中で使用できる基本的構文は、 以下のように少ししかありません。 空行は無視されます。 # で始まる行はコメントです。 $ で始まる行は条件文です。 それ以外の行はキー割り当てと変数の設定です。

デフォルトのキー割り当ては inputrc ファイルで変更できます。このライブラリを使う他のプログラムからも、 独自のコマンドとキー割り当てを追加できます。

例えば、

M-Control-u: universal-argument

C-Meta-u: universal-argument
inputrc ファイルに書くと、M-C-u で readline の universal-argument コマンドが実行されるようになります。

認識されるシンボリックな文字名を以下に示します: RUBOUT, DEL, ESC, LFD, NEWLINE, RET, RETURN, SPC, SPACE, TAB

readline では、コマンド名だけでなくキーにも文字列を割り当てできます。 つまり、そのキーが押されると文字列が挿入されます (マクロ, macro)。

Readline のキー割り当て

inputrc ファイルにおける制御キーの割り当て方は単純です。 必要なものは、コマンドの名前あるいはマクロのテキストと、 これらが割り当てられるキーシーケンスだけです。 名前は 2 通りの方法で指定できます。 つまり、シンボリックなキーの名前 (たぶん、これに Meta-Control- プレフィックスが付いたもの) による指定と、 キーシーケンスによる指定です。

keyname:function-name」あるいは 「keyname:macro」の形式を使うときには、 keyname は英語で書き下したキーの名前となります。例を以下に示します:

Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: "> output"

この例では、 C-uuniversal-argument に、 M-DELbackward-kill-word に割り当てられます。 また、 C-o はマクロの実行に割り当てられ、右辺値に展開されます (つまり、テキスト ``> output'' が編集行に挿入されます)。

後者の形式である「"keyseq":function-name」または 「"keyseq":macro」においては、 keyseq は先程の keyname とは異なり、 ダブルクォートで括ってキーシーケンス全体を示す文字列を表記しています。 以下の例で示すように、GNU Emacs 形式のキーエスケープの一部を使えます。 ただしシンボリックな文字名は認識されません。

"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"

この例でも、 C-uuniversal-argument 機能に割り当てられています。 C-x C-rre-read-init-file 機能に割り当てられ、 ESC [ 1 1 ~Function Key 1 ``Function Key 1''. という文字列の挿入に割り当てられています。

GNU Emacs 形式のエスケープシーケンスを以下に全て示します:

\C-
コントロールプレフィックス
メタプレフィックス
エスケープ文字
\\
バックスラッシュ
\"
" という文字
\'
´ という文字

GNU Emacs 形式のエスケープシーケンスに加えて、 別形式のバックスラッシュエスケープも使えます:

警告 (ベル)
バックスペース
削除 (delete)
フォームフィード
改行
復帰
水平タブ
垂直タブ
ASCII コードの 8 進値が nnn である文字 (1 文字につき数字 3 桁)
\xnnn
ASCII コードの 16 進値が nnn である文字 (1 文字につき数字 3 桁)

マクロのテキストを入力する際には、マクロ定義を示すために シングルクォートやダブルクォートを使わなければなりません。 クォートされていないテキストは関数名と見なされます。 マクロ本体では、前述のバックスラッシュによるエスケープは展開されます。 バックスラッシュはマクロのテキスト内の他の文字を全てエスケープします。 これには " や ' も含まれます。

bash では、組み込みコマンドの bind を使って、readline の現在の キー割り当ての表示と変更を行えます。 また組み込みコマンド set に対して -o オプションを使えば、編集モードを対話的利用の途中に切替え可能です (後述の シェルの組み込みコマンド を参照)。

Readline の変数

Readline の動作をカスタマイズできる変数は他にもあります。 変数は inputrc ファイル中に

set variable-name value

という形式の文で設定できます。 特に断らない限り、readline の変数は On または Off のいずれかです。 変数とそのデフォルト値を以下に示します:

readline が端末のベルを鳴らそうとしたときの動作を制御します。 none が設定されている場合は、readline はベルを鳴らしません。 visible が設定されている場合には、可能であれば可視ベル (visible bell) が用いられます。audible が設定されている場合には、 readline は端末のベルを鳴らそうとします。
readline の insert-comment コマンドが実行されたときに挿入される文字列です。 このコマンドは emacs モードでは M-# に割り当てられ、vi コマンドモードでは # に割り当てられます。
On が設定されていると、 readline がファイル名のマッチングと補完を行う際に 大文字と小文字が区別されません。
possible-completions コマンドが生成した補完候補の数が、 いくつを越えると表示の可否をユーザに問い合わせるのかを決めます。 この変数には 0 以上の任意の整数を設定できます。 補完の候補数がこの変数の値以上の場合には、 ユーザに対して候補を表示するかどうかの問い合わせがなされます。 そうでない場合には、単に端末に補完の候補がリスト表示されます。
On を設定すると、readline は 8 番目のビットがセットされている文字を ASCII のキーシーケンスに変換します。 変換は、8 番目のビットを落として、 エスケープ文字を前に追加することによって行います (実際にはエスケープ文字をメタプレフィックスとして用います)。
On を設定すると、readline は単語の補完を行わなくなります。 補完される文字の編集行への挿入は、 その文字を self-insert に割り当てたかのように行われます。
readline の起動時に emacsvi のどちらに似たキー割り当てを使うのかを制御します。 editing-mode には emacsvi のいずれかを指定できます。
On を設定すると、 readline は呼び出された時にアプリケーションキーパッドを有効にしようとします。 一部のシステムでは、矢印キーを使うためにこれを有効にする必要があります。
on を設定すると、 readline が単語の補完を試みるときにチルダ展開が行われます。
on が設定されている時、readline は表示の際に行を 1 つしか使わないようになります。つまり行がスクリーンの幅より長くなると、 新しい行に折り返すのではなく、1 つの入力行の中で横にスクロールします。
On が設定されていると、readline は 8 ビットの入力が可能になりま す(つまり、読み込んだ文字の再上位ビットを落としません)。この動作は、端 末のサポートとは無関係に行われます。 meta-flag という名前は、この変数の別名です。
インクリメンタル検索を終了させる文字からなる文字列です (終了後にその文字がコマンドとして実行されることもありません)。 この変数に値が設定されていなければ、 ESCC-J でインクリメンタル検索が終わります。
現在の readline のキーマップを設定します。 正しいキーマップ名を全て挙げると、 emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-command, vi-insert となります。vivi-command と等価で、emacsemacs-standard と等価です。 デフォルト値は emacs です。 editing-mode の値もデフォルトキーマップに影響を与えます。
On が設定されていると、 補完されたディレクトリ名の末尾にスラッシュが追加されます。
On が設定されていると、履歴行を表示する際に、 以前に変更されたものの先頭にアスタリスク (*) を付けて表示します。
On が設定されていると、 readline は 8 番目のビットが立っている文字を直接表示します。 メタ文字を前置したエスケープシーケンスでの表示は行いません。
On が設定されていると、 readline は補完でマッチするものをアルファベット順にして、 縦方向ではなく横方向に並べて表示します。
これは補完機能のデフォルトの挙動を変えます。 On が設定されている場合、単語に対する補完候補が複数個あると、 マッチするものが即座にリスト表示されます。ベルは鳴らされません。
On が設定されていると、 stat(2) で得られるファイルの種類を表す文字が、 補完候補のリスト表示の際に追加されます。

Readline の条件構文

Readline には、 C 言語のプリプロセッサの条件付きコンパイル機能と 似たコンセプトに基づく機能が実装されています。 これを使うとキー割り当てや変数の設定を評価の結果として実行できます。 パーザディレクティブは 4 つあります。

$if
$if 構文を使うと、編集モードや使っている端末、 readline を使っているアプリケーションに基づいた割り当てを行えます。 評価文のテキストは行の最後までです。 これを分離するには文字は必要ありません。
$if ディレクティブの mode= 形式は、 readline が emacs モードか vi モードのどちらになっているかを調べるために使います。 例えばこれを set keymap コマンドと一緒に使い、 readline が emacs モードで始まった時だけ キーの割り当てを emacs-standardemacs-ctlx キーマップに設定できます。
term= 形式を使うと、 端末固有のキー割り当てを入れることができます。 これは端末のファンクションキーが出力する キーシーケンスを割り当てる場合などに使えます。 = の右辺の単語は、 端末の完全な名前および最初の - の前までの部分的な名前の両方に対して評価されます。 これにより例えば、 sunsunsun-cmd の両方にマッチできます。
application はアプリケーション固有の設定を入れるために使います。 readline ライブラリを使っているプログラムはそれぞれ アプリケーション名 (application name) を設定するので、 初期化ファイルはそれが特定の値かどうかを調べられます。 これを使って、キーシーケンスを特定のプログラム用の 便利な機能に割り当てできます。例えば以下のコマンドは、 bash 内で現在または 1 つ前の単語をクォートするキーシーケンスを追加します:

$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
$endif
このコマンドは上の例で見たように、$if コマンドを終了させます。
$else
$if ディレクティブのこの分岐内におけるコマンドは、 評価が失敗した時に実行されます。
$include
このディレクティブはファイル名 1 つを引き数に取り、 そのファイルからコマンドとキー割り当てを読み込みます。 例えば以下のディレクティブを使うと /etc/inputrc が読み込まれます:

$include  /etc/inputrc

検索

readline には、指定した文字列を含む行をコマンド履歴内から探すコマンド が用意されています (後述の 履歴 を参照)。検索のモードには、 インクリメンタル (incremental) モードと 非インクリメンタル (non-incremental) モードの 2 つがあります。

インクリメンタル検索は、 ユーザが検索文字列の入力を終えるより前に検索を開始します。 検索文字列に文字が追加されるたびに、 readline は現在まで入力した文字列にマッチする履歴から 次のエントリを表示します。インクリメンタル検索で必要なのは、 探している履歴エントリを見つけるために必要な数の文字だけです。 インクリメンタル検索を終了させるには、 isearch-terminators の値に入っている文字を使います。 この変数に値が代入されていない場合には、エスケープ文字または Control-J でインクリメンタル検索が終了します。 Control-G はインクリメンタル検索を異常終了させ、元の行を復元します。 検索が終了すると、検索文字列を含む履歴エントリが現在の行になります。

マッチした他の履歴リストのエントリを見つけるには、Control-S または Control-R を適宜入力します。これにより、 今まで入力した検索文字列にマッチする次のエントリを 履歴の前方または後方に向かって探します。 readline に割り当てられた他のキーシーケンスを入力すると検索が終わり、 そのコマンドが実行されます。例えば、改行は検索を終了させて、 その行を入力します。これにより、履歴リスト中のコマンドが実行されます。

インクリメンタルでない検索の場合には、 履歴行にマッチするものの検索を始める前に検索する文字列全体を読み込みます。 検索文字列には、ユーザが入力したものか、現在の行の内容の一部を使えます。

Readline のコマンド名

以下に示すのは、 コマンドの名前およびそれらが割り当てられている デフォルトのキーシーケンスの一覧です。 対応するキーシーケンスが無いコマンド名には、 デフォルトではキーは割り当てられていません。 以下の説明では、ポイント (point) は現在のカーソルの位置を表し、 マーク (mark)set-mark コマンドによって保存されたカーソル位置を表します。 ポイントとマークの間のテキストは、リージョン (region) で表します。

移動コマンド

現在の行の先頭に移動します。
行の末尾に移動します。
1 文字進みます。
1 文字戻ります。
次の単語の最後に進みます。単語は英数字 (文字と数字) からなります。
現在の単語あるいは前の単語の先頭に戻ります。 単語は英数字 (文字と数字) からなります。
現在の行を画面の一番上の行に残したまま、画面をクリアします。 引き数を付けると、画面をクリアせずに現在の行を再描画します。
現在の行を再描画します。

履歴操作のためのコマンド

カーソルの位置に関わらず、行を入力します。この行が空でなければ、変数 HISTCONTROL の状態に従って、これが履歴リストに追加されます。 行が履歴リストを変更したものならば、履歴行は元の状態に戻されます。
履歴リストを戻り、履歴リストから前の行を取り出します。
履歴リストを進み、履歴リストから次の行を取り出します。
履歴の最初の行に移動します。
入力履歴の最後に移動します。つまり、現在入力中の行に移動します。
現在の行を開始点にして後方に向かって検索を行い、 必要に応じて履歴を「遡って」いきます。これはインクリメンタル検索です。
現在の行を開始点にして前方に向かって検索を行い、 必要に応じて履歴を「下って」いきます。これはインクリメンタル検索です。
現在の行を開始点にして、履歴リストを後方に向かって検索を行います。 この際には、ユーザが入力した文字列を 非インクリメンタルモードで検索します。
現在の行を開始点にして、履歴リストを前方に向かって検索を行います。 この際には、ユーザが入力した文字列を 非インクリメンタルモードで検索します。
history-search-forward
履歴を前方に向かって検索し、 現在の行の先頭とポイントの間の文字列を探します。 これは非インクリメンタル検索です。
history-search-backward
履歴を後方に向かって検索し、 現在の行の先頭およびポイントの間の文字列を探します。 これは非インクリメンタル検索です。
前のコマンドに対する最初の引き数 (通常は前の行の 2 番目の単語) をポイントに挿入します。引き数 n が付いていると、前のコマンドの n 番目の単語 (前のコマンドの単語は 0 から数えます)。 引き数が負ならば、前のコマンドの最後から n 番目の単語が挿入されます。
前のコマンドの最後の引き数 (一つ前の履歴エントリの最後の単語) を挿入します。 引き数があると、yank-nth-arg と全く同じように動作します。 yank-last-arg を繰り返して呼び出すと、 履歴リストを遡って参照が行われ、 それぞれの行の最後の引き数が順番に挿入されます。
シェルのように行を展開します。 エイリアスや履歴の展開など、シェルの行う単語展開を行います。 履歴の展開の説明については、後述の 履歴の展開 を参照してください。
history-expand-line (M-^)
現在の行で履歴の展開を行います。 履歴の展開の説明については、後述の 履歴の展開 を参照してください。
現在の行で履歴の展開を行い、空白を挿入します。 履歴の展開の説明については、後述の 履歴の展開 を参照してください。
alias-expand-line
現在の行でエイリアスの展開を行います。 エイリアスの展開の説明については、前述の エイリアス を参照してください。
history-and-alias-expand-line
現在の行で履歴とエイリアスの展開を行います。
yank-last-arg と同じものです。
現在の行を実行し、 現在の行の次の行を編集するために履歴から取得します。 引き数は全て無視されます。

テキスト編集のためのコマンド

ポイントの文字を削除します。 ポイントが行の先頭であり、その行に文字が無く、 さらに打ち込んだ最後の文字が delete-char に割り当てられていなければ、 EOF が返されます。
カーソルの前の文字を削除します。数値の引き数を与えると、 削除したテキストをキルリングに保存します。
カーソルが行末になければカーソルがある位置の文字を削除します。 カーソルが行末にある場合には、カーソルの前の文字を削除します。 デフォルトでは、これはキーに割り当てられていません。
次に打ち込んだ文字をそのまま行に追加します。 これは C-q 等の文字を挿入するために使います。
タブ文字を挿入します。
打ち込んだ文字を挿入します。
ポイントの前にある文字を動かし、 現在ポイントがある文字の後ろに持っていきます。 同時にポイントも前に進みます。ポイントが行の最後にある場合は、 ポイントの前の 2 文字が交換されます。 負の引き数を指定すると、何も起こりません。
ポイントの前にある単語を動かし、 ポイントの後ろにある単語の後ろに持っていきます。 この際には、ポイントも始めに前にあった単語の後ろまで移動します。
現在の (または後ろの) 単語を大文字にします。 負の引き数を指定すると、前の単語を大文字にしますが、 ポイントは動きません。
現在の (または後ろの) 単語を小文字にします。 負の引き数を指定すると、前の単語を小文字にしますが、 ポイントは動きません。
現在の (または後ろの) 単語をキャピタライズします (単語の先頭の文字を大文字にします)。 負の引き数を指定すると前の単語をキャピタライズしますが、 ポイントは動きません。

キルとヤンク

ポイントから行末までのテキストをキルします。
現在のカーソル位置から行頭までをキルします。
ポイントから行頭までをキルします。 キルされたテキストはキルリング (kill-ring) に入ります。
現在の行の文字を全てキルします。ポイントの位置は関係ありません。
ポイントから現在の単語の終わりまでをキルします。 ポイントが単語と単語の間であれば、後ろの単語の終わりまでをキルします。 単語の境界は forward-word で使われているものと同じです。
ポイントの下にある単語をキルします。 単語の境界は backward-word で使われているものと同じです。
ポイントの下にある単語をキルします。 その際には空白を単語の境界として用います。 キルされたテキストはキルリングに入ります。
ポイントの周りの空白とタブを全て削除します。
現在のリージョン中のテキストをキルします。
リージョン中のテキストをキルバッファにコピーします。
ポイントの前の単語をキルバッファにコピーします。単語の境界は backward-word と同じです。
ポイントの後ろの単語をキルバッファにコピーします。単語の境界は forward-word と同じです。
キルリングの先頭のテキストをポイントのあるバッファにヤンクします。
キルリングをローテートし、新たに先頭になったテキストをヤンクします。 yank または yank-pop の後にしか使えません。

数値の引き数

既に蓄積中の引き数にこの数字を追加するか、 またはこの数字によって新しい引き数を始めます。 M-- を使うと、負の値を指定できます。
引き数を指定する別法です。 このコマンドの後に 1 つ以上の数字がある場合 (頭にマイナス記号を付けることもできます)、 これらの数字で引き数が定義されます。 コマンドの後に数字を続けた場合、 universal-argument を再び実行すると数値の引き数を終了しますが、 そうでない場合は無視されます。 特殊なケースとして、 このコマンドの直後に数字でもマイナス記号でもない文字がある場合には、 次のコマンドの引き数カウントは 4 倍にされます。 最初は引き数カウントは 1 なので、 この機能を一度実行すると引き数カウントは 4 になり、 次に実行すると引き数カウントは 16 になります。 それ以降も同様です。

補完

ポイントの前のテキストについて補完を試みます。 bash が補完を行う際にはテキストの扱いの種類を順に試しますが、 その順序は、変数 (テキストが $ で始まる場合)、 ユーザ名 (テキストが ~ で始まる場合)、 ホスト名 (テキストが @ で始まる場合)、 コマンド (エイリアスや関数も含みます) です。 これらのうちいずれにもマッチしない場合には、 ファイル名補完を試みます。
ポイントの前のテキストを補完して得られるものの候補を列挙します。
ポイントの前のテキストを補完して得られるものを全て挿入します。 挿入されるものは、possible-completions で列挙されるものと同じです。
complete コマンドに似ていますが、 補完される単語を補完候補リストのうちの 1 つと置換します。 menu-complete を繰り返して実行すると、 補完の候補リストが次々と順番に挿入されます。 補完リストの最後まで来るとベルが (bell-style の設定に基づいて) 鳴らされ、元のテキストに戻ります。 引き数 n を指定すると、リスト中の位置が n 個進みます。 負の引き数を指定すると、リスト中を逆向きに戻れます。 このコマンドは TAB に割り当てることを意図して用意されたものですが、 デフォルトでは割り当ては行われていません。
カーソルが行頭や行末に無ければ、カーソルの下の文字を削除します (delete-char と同様です)。カーソルが行末にある場合は、 possible-completions と同じ動作をします。 このコマンドはデフォルトではキーに割り当てられていません。
ポイントの前のテキストについて、ファイル名の補完を試みます。
ポイントの前のテキストについて、補完の候補を列挙します。 テキストはファイル名として扱います。
ポイントの前のテキストについて補完を試みます。 テキストはユーザ名として扱います。
ポイントの前のテキストについて補完の候補を列挙します。 テキストはユーザ名として扱います。
ポイントの前のテキストについて補完を試みます。 テキストはシェル変数として扱います。
ポイントの前のテキストについて補完の候補を列挙します。 テキストはシェル変数として扱います。
ポイントの前のテキストについて補完を試みます。 テキストはホスト名として扱います。
ポイントの前のテキストについて補完の候補を列挙します。 テキストはホスト名として扱います。
ポイントの前のテキストについて補完を試みます。 テキストはコマンド名として扱います。 コマンド補完の際にマッチングを試みる順序は、 エイリアス、予約語、シェル関数、シェルの組み込みコマンド、 実行ファイルです。
ポイントの前のテキストについて補完の候補を列挙します。 テキストはコマンド名として扱います。
ポイントの前のテキストについて補完を試みます。 テキストの比較が行われるのは、 履歴リスト中の行のうち補完の候補となるものです。
ファイル名補完を実行し、補完の候補リストを挿入します。 シェルから利用可能なリストとなるように、 返される候補はブレースで括られます (前述の ブレース展開 を参照)。

キーボードマクロ

現在のキーボードマクロに対して入力される文字列の保存を開始します。
現在のキーボードマクロに対して入力された文字列の保存を終了し、 この定義を格納します。
最後に定義されたキーボードマクロを再実行します。 再実行は、 マクロ中の文字列をキーボードでの入力と同様に出力することによって行います。

その他

inputrc ファイルの内容を読み込み、 このファイル中の割り当てや変数設定を取り込みます。
現在の編集行を捨て、端末のベルを鳴らします (この動作は bell-style の設定に従って行います)。
メタ文字と共に入力された文字 x が小文字であれば、 これに対応する大文字に割り当てられているコマンドを実行します。
次に入力される文字を、 メタプレフィックスされたことにします。 ESC fMeta-f と同じ意味です。
インクリメンタルアンドゥを行います。 これは行ごとに別々に記憶されています。
この行に対して行った変更を全て取り消します。 このコマンドは、行が初期状態に戻るまで undo コマンドを実行するようなものです。
現在の単語についてチルダ展開を実行します。
ポイントにマークを設定します。 数字の引き数が与えられた場合には、 マークにはその位置が設定されます。
ポイントをマークと入れ換えます。 現在のカーソル位置は保存されている位置となり、 古いカーソル位置がマークとして保存されます。
文字を 1 つ読み込み、 その文字が次に現われる場所にポイントを移動させます。 負のカウントを与えると、その文字が前に現われた場所を探します。
文字を 1 つ読み込み、 その文字が前に現われた場所にポイントを移動させます。 負のカウントを与えると、その文字が次に現われる場所を探します。
まず readline の comment-begin 変数の値が現在の行の先頭に挿入され、 次に改行が打ち込まれたのと同じように行の入力が行われます。 comment-begin のデフォルト値によって、 このコマンドは現在の行をシェルのコメントとします。
ポイントの前の単語がパス名展開のパターンとして扱われ、 この単語と置き換えられる形でマッチするファイル名のリストが挿入されます。
glob-expand-word で生成されるのと同じ展開結果のリストが表示され、 行が再描画されます。
機能とそのキー割り当てを全て、 readline の出力ストリームに出力します。 数値の引き数を与えると、 出力は inputrc に書き込める形に整形されます。
設定可能な readline の変数とその値を全て readline の出力ストリームに出力します。 数値の引き数を与えると、 出力は inputrc に書き込める形に整形されます。
マクロとマクロが出力する文字列に割り当てられた readline のキーシーケンスを全て出力します。 数値の引き数を与えると、 出力は inputrc に書き込める形に整形されます。
現在実行している bash のバージョン情報を表示します。

プログラム補完

complete 組み込みコマンドで 補完仕様 (compspec) が定義されているコマンドに対して 引き数の単語補完が試みられると、 プログラム可能な補完の機能が呼び出されます (complete 組み込みコマンドについては、後述する シェルの組み込みコマンド を参照)。

まず、コマンド名が特定されます。 そのコマンドに対して補完仕様が定義されていれば、 それがその単語の補完候補のリスト作成に使われます。 コマンドの単語がフルパス名であれば、 最初にフルパス名の補完仕様が検索されます。 フルパス名の補完仕様が見つからなかった場合は、 最後のスラッシュ以降の部分に対して該当する補完仕様を見つけようとします。

補完仕様が見つかると、 それはマッチする単語のリストを作成するために使用されます。 補完仕様が見つからなかった場合は、 前述の 補完 で説明したようなデフォルトの bash の補完が行われます。

まず、補完仕様で指定された動作が用いられます。 補完される単語の前置部分にマッチするものだけが返されます。 ファイル名やディレクトリ名の補完に -f-d オプションが使用された場合は、シェル変数 FIGNORE がマッチのフィルタとして使用されます。

続いて -G オプションによって指定された ファイル名展開パターンの補完が生成されます。 パターンによって生成された単語は、 補完される単語とマッチする必要はありません。 GLOBIGNORE シェル変数はマッチのフィルタとしては使われませんが、 FIGNORE 変数は使用されます。

次に、 -W オプションで指定された引き数の文字列が考慮されます。 文字列は、最初に IFS 特殊変数の文字を区切り文字として分割されます。 シェルのクォート処理は考慮されます。 それぞれの単語は、前述の 展開 で示したように、ブレース展開、チルダ展開、パラメータと変数の展開、 コマンド置換、算術式展開、パス名展開が行われます。 結果は、前述の単語の分割で示した規則によって分割されます。 展開の結果は補完される単語の前置部分とマッチが行われ、 マッチした単語が補完候補となります。

これらのマッチが生成された後、 シェル関数や -F-C オプションで指定されたコマンドが呼び出されます。 コマンドや関数が呼び出されるときは、 COMP_LINECOMP_POINT 変数に後述のシェル変数で示すように値が設定されます。 シェル関数が呼び出される場合は、 COMP_WORDSCOMP_CWORD 変数も設定されます。 関数やコマンドが呼び出されるときは、 最初の引き数は引き数が補完されるコマンドの名前、 二番目の引き数は補完される単語、 三番目の引き数は現在のコマンドラインで補完中の単語の 前に置かれる単語となります。 補完される単語に対して生成された補完の候補はフィルタリングされません。 関数やコマンドは生成されたマッチとは無関係に補完されます。

-F で指定された関数がまず呼び出されます。 関数は、後述する compgen 組み込みコマンドを含めた、 全てのシェルの機能を使ってマッチを生成します。 補完候補は必ず COMPREPLY 配列変数に格納されます。

続いて -C オプションで指定されたコマンドが呼び出され、 環境変数をコマンド置換します。 このコマンドは、補完候補を 1 行にひとつずつ標準出力に出力します。 必要があれば、バックスラッシュが改行をエスケープするために使用されます。

全ての補完候補が生成された後で、 -X オプションで指定されたフィルタが補完候補に作用します。 フィルタは、パス名展開で使用されたようなパターンです。パターン中の & は補完される単語に置換されます。 文字通りの & はバックスラッシュでエスケープします。 バックスラッシュはマッチを試みる前に削除されます。 パターンにマッチした補完は候補から削除されます。 先行する ! はパターンを否定します。 この場合、パターンにマッチしなかった補完が削除されます。

最後に、-P-S オプションで指定された 前置部分と後置部分が補完候補のそれぞれに加えられます。 そして結果が readline 補完コードに補完候補のリストとして返されます。

直前に行われた動作が何にもマッチせず、 補完仕様が定義されたときに -o dirname オプションが complete に与えられていれば、 ディレクトリ名への補完が試みられます。

デフォルトでは、補完仕様が見つかった場合、 それが生成したものがなんであれ、 可能性のある補完すべてのリストとして、補完コードに返されます。 デフォルトの bash 補完は試みられず、 readline のデフォルトのファイル名補完は無効になります。 補完仕様の定義時に -o default オプションが complete に与えられていれば、 補完仕様が何にもマッチしなければ readline のデフォルトの補完が行われます。

履歴 (HISTORY)

-o history オプションを組み込みコマンドの set で有効にすると、 コマンド履歴 (command history) (以前に入力したコマンドのリスト) にアクセスできるようになります。 変数 HISTSIZE の値が、 履歴リストに保存するコマンドの数になります。 過去に入力したコマンドのうち、最新 HISTSIZE 個分 (デフォルトは 500 個) のテキストが保存されます。 シェルは各コマンドを、パラメータ展開や変数展開 (前述の 展開 を参照) を行う前のかたちで履歴リストに格納します。 ただし、履歴展開は実行してから格納します。 履歴展開はシェル変数 HISTIGNOREHISTCONTROL の値に従って実行されます。

起動時に、履歴は HISTFILE 変数 (デフォルトは ~/.bash_history) が示すファイルの内容で初期化されます。 HISTFILE で指定されたファイルは、 HISTFILESIZE で指定された行数を越えないように、必要に応じて切り詰められます。 対話的なシェルが終了する際には、最近の HISTSIZE 個の行が履歴リストから HISTFILE にコピーされます。 シェルオプションの histappend ( シェルの組み込みコマンド の項の shopt の説明を参照) が有効になっていると、 これらの行は履歴ファイルの末尾に追加されます。 このオプションが無効ならば、履歴ファイルは上書きされます。 HISTFILE が設定されていないか、履歴ファイルが書き込めない状態だと、 履歴は保存されません。 履歴の保存を行った後には、履歴ファイルは行数が HISTFILESIZE 行を越えないように切り詰められます。 HISTFILESIZE が設定されていなければ、切り詰めは行われません。

組み込みコマンド fc (後述の シェルの組み込みコマンド を参照) を用いると、履歴リストの一部をリスト・編集して再実行できます。 組み込みコマンドの history を用いると、履歴リストを表示・編集したり、 履歴ファイルを操作できます。 コマンドラインを編集する際には、 各編集モードでいろいろな検索コマンドが利用でき、 履歴リストへアクセスできます。

このシェルでは、どのコマンドが履歴リストに保存されるかを制御できます。 HISTCONTROL 変数と HISTIGNORE 変数を設定すると、 シェルは入力されたコマンドの一部しか保存しなくなります。 シェルオプションの cmdhist を有効にすると、シェルは複数行に別れているコマンドの各行を 同じ履歴エントリに保存しようとします。 この際には、文法的な正しさを保つためにセミコロンが必要に応じて追加されます。 シェルオプションの lithist を有効にすると、このシェルは行の途中に セミコロンではなく改行文字を置く形でコマンドを保存します。 シェルオプションの設定と設定取り消しについては、後述の シェルの組み込みコマンド における説明を参照してください。

履歴の展開

このシェルは、 csh の履歴展開と同じような機能をサポートしています。 このセクションでは、履歴展開で使用できる記法・機能を説明します。 この機能は対話的シェルならばデフォルトで有効になっていますが、 組み込みコマンド set+H オプション (後述の シェルの組み込みコマンド を参照) で無効にできます。 非対話的シェルの場合は、デフォルトでは履歴展開は行われません。

履歴展開は、履歴リスト中の単語を入力ストリームに入れます。 この機能を利用すると、コマンドを繰り返したり、 前のコマンドで指定したオプションを現在の入力行に挿入したり、 前のコマンドの誤りを手早く直したり、 といったことが簡単にできるようになります。

履歴展開が実行されるのは入力行全体を読み込んだ直後であり、 シェルが行を単語に分割するよりも前です。 履歴展開の動作は 2 段階で行われます。 まず最初に、置換に使う行を履歴リストから選びます。 次に、その行のどの部分を現在の行に書き込むかを選択します。 履歴リストから選ばれた行はイベント (event) と呼ばれ、 この行のうち動作の対象となる部分を単語列 (words)と呼びます。 様々な修飾子 (modifier) が利用でき、 選択された単語列の操作が可能になっています。 行の単語への分割は入力を読み込む時と同じように行われるので、 メタ文字で区切られた複数の単語をクォートで括ったものは 1 つの単語と見なされます。 履歴展開が行われるのは、履歴展開文字が現われた時です。 履歴展開文字はデフォルトでは ! です。 履歴展開文字をクォートできるのは、 バックスラッシュ (\) とシングルクォートだけです。

組み込みコマンドの shopt を用いて、何種類かあるシェルオプションを設定すると、 履歴展開の動作を調整できます。 シェルオプションの histverify が有効で (組み込みコマンド shopt の説明を参照)、かつ readline が使われている場合には、 履歴置換を行った結果はすぐにはシェルのパーザに渡されません。 展開された行は readline の編集バッファに再び読み込まれ、さらに編集が行える状態になります。 readline を使用しており、かつシェルオプションの histreedit が有効である場合、履歴置換が失敗してもその結果は readline の編集バッファに再び読み込まれ、訂正できる状態となります。 組み込みコマンド history-p オプションを使うと、実際に履歴展開を行う前に、 どのように展開されるのかを見ることができます。 組み込みコマンド history-s オプションを使うと、 コマンドを履歴リストの末尾に (実際の実行はせずに) 追加できます。 追加したコマンドは、後で再呼び出しできます。

このシェルでは、履歴展開機構で使ういろいろな文字を制御できます (前述の シェル変数 の項目における histchars の説明を参照)。

イベント指示子 (Event Designator)

イベント指示子は、 履歴リスト中のコマンドラインエントリを参照するものです。

!
履歴置換を開始します。ただし、ブランク文字、 改行文字、=, ( のいずれかが後に続く場合は除きます。
!n
n 行目のコマンドラインを参照します。
!-n
現在から n 行前のコマンドラインを参照します。
!!
1 行前のコマンドラインを参照します。`!-1' と同義です。
!string
string で始まるコマンドのうち、一番現在に近いところで実行したものを参照します。
!?string[?]
string を含むコマンドのうち、一番現在に近いところで実行したものを参照します。 string の直後が改行文字ならば、最後の ? は省略しても構いません。
^string1^string2^
簡易置換。 string1string2 に置換して直前のコマンドを繰り返します。 ``!!:s/string1/string2/'' と同義です (後述の修飾子を参照)。
!#
今までのところまでに打ち込んだコマンドライン全体です。

単語指示子 (Word Designators)

単語指示子 (word designator) は、 イベントから欲しい単語を選ぶ時に用いられます。 イベント指定と単語指示子のセパレータには : を用います。 単語指示子が ^, $, *, -, % のいずれかで始まる場合には、このセパレータは省略できます。 単語には行の先頭から番号が振られます。 先頭の単語が 0 番目になります。 単語は現在の行に、空白 1 つで区切られて挿入されます。

0 (ゼロ)
0 番目の単語。このシェルにとっては、これはコマンドを表す単語です。
n 番目の単語。
^
最初の引き数。つまり 1 番目の単語です。
$
最後の引き数。
%
`?string?' 検索にマッチする、一番現在に近い単語。
x-y
単語の範囲。`0-y' の省略形として `-y' が使えます。
*
0 番目を除く全ての単語。これは `1-$' の別表現です。 イベント中に 1 つしか単語が現われないときに * を使ってもエラーにはなりません。 このような場合には空文字列が返されます。
x-$ の省略形です。
x-
x* と同様に x-$ の省略形ですが、 ただし最後の単語は含みません。

イベント指定なしに単語指示子が与えられた場合、 直前のコマンドがイベントとして使われます。

修飾子 (Modifiers)

単語指示子 (省略可能) の後には、 以下に示す修飾子を、1 個以上のシーケンスのかたちで置けます。 それぞれの修飾子の前には `:' をつけます。

パス名から末尾にある部分 (ファイル名) を取り除き、 前の方 (ディレクトリ部) だけを残します。
パス名から前の方 (ディレクトリ部) を取り除き、 末尾にある部分 (ファイル名) だけを残します。
末尾にある .xxx 形式のサフィックスを取り除き、 ベース名 (basename) だけを残します。
末尾のサフィックスだけを残して、全ての部分を取り除きます。
新しいコマンドを表示しますが、実行はしません。
置換が行われた単語をクォートし、それ以上の置換が行われないようにします。
q と同じように置換後の単語をクォートしますが、 空白文字 と改行文字のところで単語に分割します。
イベント行で最初に現われた oldnew に置き換えます。/ の代わりに任意の区切り文字を使うこともできます。 最後の区切り文字がイベント行の最後の文字ならば、 これは省略できます。 oldnew の中では、 バックスラッシュ 1 つでクォートすれば区切り文字も使えます。 new に & が含まれている場合には、これは old に置き換えられます。 バックスラッシュ 1 つを前に置けば & をクォートできます。 old が空文字列ならば、これには前回に置換された old が設定されます。 以前に履歴置換が全く行われていない場合には、現在に一番近い !?string[?] の検索で使われた string が設定されます。
&
直前の置換を繰り返します。
変更をイベント行全体に適用します。 これは `:s' と組み合わせて使われます (例:`:gs/old/new/')。 `:s' と一緒に使った場合には、 / の代わりに任意の区切り文字を使えます。 また最後の区切り文字がイベント行の最後の文字ならば、 これは省略できます。

シェルの組み込みコマンド

特に断らない限り、このセクションで説明されている組み込みコマンドのうち - で始まるオプションを受け付けるものは、オプションの終わりを表す -- も受け付けます。

: [arguments]
何もしません。このコマンドは arguments を展開し、指定されたリダイレクトを実行する以外には何も行いません。 終了コード 0 を返します。
. filename [arguments]
filename からコマンドを読み込み、現在のシェル環境のもとで実行します。そして filename 中で最後に実行したコマンドの終了ステータスを返します。 filename にスラッシュが含まれていない場合、 filenamePATH に含まれるディレクトリから探されます。 PATH 内で検索されるファイルは、実行可能である必要はありません。 bashposix モード で動作していなければ、 PATH 中でファイルを見つけられなかった場合には、 カレントディレクトリが検索されます。 組み込みコマンド shopt に対する sourcepath オプションが無効にされている場合、 PATH の検索は行われません。 何らかの arguments が与えられている場合、これらの引き数は filename を実行した時の位置パラメータとなります。 そうでない場合は、位置パラメータは変更されません。 返却ステータスはスクリプト内で最後に実行したコマンドのステータスです (コマンドが全く実行されなければ 0 です)。また filename が見つからない場合や読み込めない場合には偽となります。
alias [-p] [name[=value] ...]
alias コマンドを引き数を付けずに (あるいは -p オプションを付けて) 実行すると、エイリアスのリストが 「alias name=value」の形で標準出力に出力されます。 引き数を与えた場合には、value を与えられた name それぞれに対するエイリアスが定義されます。 value の末尾に空白があると、エイリアスが展開された時に、 空白の次の単語についてエイリアス置換があるかどうか調べられます。 引き数リスト中に value が与えられていない name があった場合は、 それぞれに対して名前とエイリアスの値が出力されます。 エイリアスが定義されていない name が与えられなければ、 alias は真を返します。
サスペンドされているジョブ jobspec を バックグラウンドで実行再開します。このジョブは、初めから & を付けて起動されていたかのように動作を続けます。 jobspec が無い場合には、 シェルが記録しているカレントジョブ (current job) が使われます。 bg jobspec は通常 0 を返しますが、ジョブ制御が無効であるときに実行した場合や、 ジョブ制御が有効であっても jobspec が有効なジョブを指定していない場合や jobspec がジョブ制御無しで実行したジョブを指定している場合は異なる値を返します。
bind [-m keymap] [-lpsvPSV]
readline の現在のキー割り当てと関数割り当てを表示します。 あるいはキーシーケンスを readline の関数やマクロに割り当てます。受け付ける割り当ての記法は .inputrc と全く同じですが、 それぞれの割り当ては別々の引き数として渡さなければなりません。 例えば '"\C-x\C-r": re-read-init-file' のように指定します。 オプションを指定した場合には、以下のような意味を持ちます:
-m keymap
キーマップ keymap を、以降の割り当てによって変更します。指定できる keymap 名は、emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command, vi-insert です。 vivi-command と同じです。 また emacsemacs-standard と同じです。
readline 関数の名前を全てリスト表示します。
readline の関数の名前と割り当てを表示します。 表示は、再び読み込みできる形式で出力されます。
readline の関数の現在の名前と割り当てをリスト表示します。
readline の変数名と値を表示します。 表示は、再び読み込みできる形式で出力されます。
readline の現在の変数名と値をリスト表示します。
readline のマクロに割り当てられたキーシーケンスと、 マクロが出力する文字列を表示します。 表示は、再び読み込みできる形式で出力されます。
readline のマクロに割り当てられたキーシーケンスと、 マクロが出力する文字列を表示します。
-f filename
キー割り当てを filename から読み込みます。
-q function
指定された function を呼び出すキーを問い合わせます。
-u function
指定された function に割り当てられているキーの割り当てを 全て取り消します。
-r keyseq
keyseq に対する現在の割り当てを削除します。
-x keyseq:shell-command
keyseq が押されるたびごとに、 shell-command が実行されるようにします。

認識できないオプションが与えられた場合やエラーが起きた場合を除けば、 返り値は 0 です。

for, while, until, select のループから抜けます。n が指定されていれば、n レベル分 break します。 n は 1 以上でなければなりません。 n がループの深さよりも大きい場合には、全てのループから抜けます。 n が 0 以下なら、返り値は 0 以外の値となります。 さもなければ、 break は 0 を返します。
builtin shell-builtin [arguments]
指定されたシェル組み込みコマンドを実行します。コマンドには arguments を引き数として渡し、このコマンドの終了ステータスを返します。 これはシェル組み込みコマンドと同じ名前の関数を定義する時に便利で、 その関数内で組み込みコマンドを使った時に、その機能を損ないません。 組み込みコマンド cd は普通、これを使って再定義されます。 shell-builtin がシェル組み込みコマンドでなければ、終了ステータスは偽となります。
カレントディレクトリを dir に変更します。 変数 HOME の値が dir のデフォルト値です。変数 CDPATH は、 dir を含むディレクトリの検索パスを定義します。 CDPATH 内ではディレクトリ名はコロン (:) で区切ります。 CDPATH 中に空のディレクトリ名がある場合、これはカレントディレクトリ (つまり ``.'') を意味します。 dir がスラッシュ (/) で始まる場合には、 CDPATH は使われません。 -P オプションは、シンボリックリンクを辿らないで物理的なディレクトリ構造を 使うように指示します (組み込みコマンド set-P オプションも参照)。 -L オプションを指定すると、シンボリックリンクを辿るようになります。 引き数に - を指定するのは、 $OLDPWD を指定するのと同じ意味です。 ディレクトリの変更が成功した場合には返り値は真になります。 そうでない場合には偽になります。
command [-pVv] command [arg ...]
command に引き数 args を付けて実行します。シェル関数の通常の参照は行いません。 組み込みコマンドと PATH 内で見つかるコマンドだけが実行されます。 -p オプションが与えられると、 command の検索を行う際に PATH のデフォルト値が使われます。これにより、 標準ユーティリティを全て確実に見つけられます。 -V オプションまたは -v オプションを与えると、 command の説明が出力されます。 -v オプションでは、 command を起動する時に使われるコマンドやファイル名を示す単語が表示されます。 -V ではさらに詳しい説明が表示されます。 -V オプションや -v オプションを与えた場合、終了ステータスは command が見つかれば 0 となり、見つからなければ 1 となります。 どちらのオプションも与えなかった場合に、エラーが起きたり command を見つけられなかったりすると、終了ステータスは 127 になります。 それ以外の場合には、組み込みコマンド command の終了ステータスは、 command の終了ステータスです。
option にしたがって、word の補完マッチのリストを生成します。 オプションには complete 組み込みコマンドと同じものが指定できますが、 -p-r は指定できません。 マッチのリストは標準出力に出力されます。 -F-C オプションを使用したときは、 プログラム補完機能によって設定されたさまざまなシェル変数は、 利用可能であっても有用な値を持ちません。

マッチは、同じフラグで指定されたプログラム補完コードが 直接補完を生成するのと同じ方法で生成されます。 word が指定されると、word にマッチする補完だけが表示されます。

戻り値は、 無効なオプションが指定された場合やマッチが生成されなかった場合以外は 真になります。

complete [-abcdefjkvu] [-o comp-option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix]

[-X filterpat] [-F function] [-C command] name [name ...]
name 引き数それぞれを、どのように補完するのかを指定します。 -p オプションが指定された場合や、 何もオプションが指定されなかった場合は、 既存の補完指定が (入力として再利用できるかたちで) 出力されます。 -r オプションは、それぞれの name の補完指定を削除します。 name が指定されなかった場合はすべての補完指定を削除します。

単語補完が試みられたときにこれらの補完指定に加えられる処理は、 前述の プログラム補完 で示しています。

他のオプションが指定されたときは、以下のような意味を持ちます。 -G, -W, -X オプションの引き数 (必要ならば -P-S オプションの場合も) はクォートして、 complete 組み込みコマンドが呼び出される前に展開されないようにすべきです。

-o comp-option
comp-option は補完仕様の動作をいくつかの点から制御し、 単純な補完生成以外ができるようにします。 comp-option には以下のどれかひとつを指定できます。
補完仕様がマッチを全く生成しなかった場合に、 readline のデフォルトの補完を用います。
補完仕様がマッチを全く生成しなかった場合に、 ディレクトリ名を補完しようとします。
補完仕様がファイル名を生成することを readline に伝え、 readline がファイル名特有の処理 (ディレクトリ名にスラッシュを加えたり、末尾の空白を削除したり、など) を行えるようにします。 シェル関数と共に用いることを想定しています。
action は補完対象リストの生成動作で、 以下のどれかひとつを指定します。
エイリアス名。-a でも指定できます。
配列変数名。
readline キー割り当て名。
シェル組み込みコマンド名。-b でも指定できます。
コマンド名。-c でも指定できます。
ディレクトリ名。-d でも指定できます。
無効にされているシェル組み込みコマンドの名前。
有効にされているシェル組み込みコマンドの名前。
エクスポートされたシェル変数の名前。 -e でも指定できます。
ファイル名。-f でも指定できます。
シェル関数の名前。
help 組み込みコマンドで許可されたヘルプトピック。
HOSTFILE シェル変数で指定されたファイルから得られたホスト名。
ジョブ制御が有効であれば、ジョブ名。-j でも指定できます。
シェルの予約語。-k でも指定できます。
ジョブ制御が有効であれば、実行中のジョブ名。
set 組み込みコマンドの -o オプションで有効な引き数。
shopt 組み込みコマンドで許可されたシェルオプション名。
シグナル名。
ジョブ制御が有効であれば、停止しているジョブ名。
ユーザ名。-u でも指定できます。
すべてのシェル変数名。-v でも指定できます。
ファイル名展開パターン globpat が展開されて補完対象のリストを生成します。
-W wordlist
wordlistIFS 特殊変数を区切り文字として分割され、 それぞれの分割された単語は展開されます。 補完対象は、展開結果のリストのメンバのうち、 補完中の単語がマッチするものです。
-C command
command がサブシェル環境で実行され、 その出力が補完対象として使用されます。
シェル関数 function は現在のシェル環境で実行されます。 関数が終了したときに、補完対象が COMPREPLY 配列変数から取得されます。
filterpat はファイル名展開として使用されるパターンです。 先行するオプション・引き数によって生成された補完対象リストに適用され、 filterpat とマッチするそれぞれの補完がリストから削除されます。 filterpat の前に ! を置くとパターンを否定します。 この場合、filterpat にマッチしない補完が削除されます。
-P prefix
他のすべてのオプションが作用したあとに、 prefix がそれぞれの補完対象の先頭に追加されます。
-S suffix
他のすべてのオプションが作用したあとに、 prefix がそれぞれの補完対象の末尾に追加されます。

不正なオプションが指定された場合、-p-r 以外のオプションで name が指定されなかった場合、 存在しない name の指定によって補完が削除されようとした場合、 補完の指定の追加に失敗した場合、を除いては、返り値は真になります。

for, while, until, select ループの次の繰り返し分から実行を継続します。 n を指定すると、深さを n 個分上がったループで実行を継続します。 n は 1 以上でなければなりません。 n がループの深さよりも大きい場合、 最後のループ (「トップレベル」のループ) で実行が継続されます。 ループの中で continue が実行された時に、 n が 0 以下なら、返り値は 0 以外の値となります。 さもなければ、 continue は 0 を返します。 ループの外で continue が実行された時には、返り値は 0 となります。
declare [-afFirx] [-p] [name[=value]]
変数を宣言したり、変数に属性を与えたりします。 name を指定しなければ、変数の値が表示されます。 -p オプションを指定すると、 name それぞれの属性と値が表示されます。 -p を使うと他のオプションは無視されます。 -F オプションを指定すると、関数定義の表示を止めます。 関数の名前と属性だけが出力されます。 -F オプションを指定すると、 -f オプションも指定したことになります。以下のオプションを使うと、 指定した属性を持つ変数の出力を制限したり、 変数に属性を与えたりできます:
name はそれぞれ配列変数 (前述の 配列 を参照) です。
関数名だけを使います。
変数を整数として扱います。変数に値が代入された時に算術式評価 ( 算術式評価 を参照) が実行されます。
name を読み込み専用にします。 これ以降、代入文を用いて値を代入したり unset したりできなくなります。
name に印を付け、 これ以降に実行するコマンドに環境経由でエクスポートします。

`-' ではなく `+' を使うと属性を消します。 ただし例外として、+a を使って配列変数を破棄することはできません。 関数内で使った場合、 local コマンドを使った場合と同様に name はローカルとなります。 返り値は基本的には 0 ですが、不正なオプションに出会った場合、 ``-f foo=bar'' を使って関数を定義しようとした場合、 読み込み専用の変数に代入しようとした場合、 複合代入構文を使わずに配列変数に値を代入しようとした場合 (前述の 配列 を参照)、name のいずれかが正しいシェル変数名でない場合、 読み込み専用変数の読み込み専用属性を無効にしようとした場合、 存在しない関数を -f オプションで表示しようとした場合は除きます。

オプションが無いときは、 現在記憶しているディレクトリのリストが表示されます。 デフォルトでは、全てのディレクトリ名は空白で区切って 1 行で表示されます。ディレクトリは pushd コマンドによってリストに追加されます。 popd コマンドはリストからエントリを削除します。
+n
オプション無しで dirs を起動した時に表示されるリストの、 左から数えて n 番目のエントリを表示します。 エントリは 0 から始まります。
-n
オプション無しで dirs を起動した時に表示されるリストの、 右から数えて n 番目のエントリを表示します。 エントリは 0 から始まります。
全てのエントリを削除し、ディレクトリスタックをクリアします。
長い形式のリスト表示を行います。 デフォルトのリスト表示フォーマットでは、 チルダを使ってホームディレクトリを表します。
1 行に 1 エントリの形でディレクトリスタックを出力します。
1 行に 1 エントリの形でディレクトリスタックを出力します。 各エントリの前にはスタック内での番号が表示されます。

不正なオプションが与えられた場合とインデックス n がディレクトリスタックの終端を越えている場合を除き、 返り値は 0 となります。

オプション無しの場合には、それぞれの jobspec がアクティブなジョブのテーブルから削除されます。 -h オプションが与えられている場合、どの jobspec もテーブルから削除されず、 シェルが SIGHUP を受け取ってもそのジョブには SIGHUP が送られないように印が付けられます。 jobspec がなく、かつ -a オプションも -r オプションも与えられていない場合には、カレントジョブが使われます。 jobspec が与えられていない場合、 -a オプションは全てのジョブを削除するか 全てのジョブに印を付けるという意味 となります。 jobspec 引き数なしで -r オプションを指定すると、 実行中のジョブだけが操作の対象となります。 jobspec が不正なジョブを指定していなければ、返り値は 0 となります。
arg を空白で区切って出力し、最後に改行を出力します。 終了ステータスは常に 0 です。 -n が指定された場合、最後の改行は出力されません。 -e オプションを指定した場合、 以下に示す、バックスラッシュのエスケープ文字が解釈されるようになります。 -E オプションを指定すると、 デフォルトでこのようなエスケープ文字が解釈されるシステムであっても、 エスケープ文字が解釈されないようになります。 xpg_echo シェルオプションを用いると、 echo がこれらのエスケープ文字を展開するかどうかの デフォルト動作を動的に決定できます。 echo-- をオプションの終わりと解釈しません。 echo は以下のエスケープシーケンスを解釈します:
警告(ベル)
バックスペース
行末に改行を付けない
エスケープ文字
フォームフィード文字
改行
復帰文字
水平タブ
垂直タブ
\\
バックスラッシュ
\0nnn
ASCII コードの 8 進値が nnn である文字 (1 文字につき数字 3 桁)。
\xnnn
ASCII コードの 16 進値が nnn である文字 (1 文字につき数字 3 桁)。
組み込みコマンドの有効/無効を設定します。 シェルは通常はディスクコマンドの前に組み込みコマンドを探しますが、 組み込みコマンドを無効にすると、 シェルの組み込みコマンドと同じ名前を持つディスクコマンドを、 完全なパス名を指定しなくても実行できます。 -n を用いると、それぞれの name は無効となります。 それ以外の場合には、name は有効となります。 例えば、シェル組み込みのものでなく PATH 上にある test バイナリを使うには ``enable -n test''. を実行します。 -f オプションは新しい組み込みコマンド name を共有オブジェクト filename からロードするという意味です。 これは動的ロードをサポートしているシステムで使えます。 -d オプションは、以前に -f オプションでロードした組み込みコマンドを削除します。 引き数 name が与えられなかった場合や、 -p オプションが与えられた場合、 シェルの組み込みコマンドのリストが表示されます。 他にオプション引き数が指定されていない場合には、 有効になっているシェル組み込みコマンド全てからなるリストが表示されます。 -n を与えると、無効にされている組み込みコマンドだけが出力されます。 -a を与えると、 それぞれ有効かどうかの表示付きで全ての組み込みコマンドが出力されます。 -s を与えると、出力されるのは POSIX の特殊組み込みコマンドだけに制限されます。 name がシェル組み込みコマンドでない場合と、 共有オブジェクトからの新しい組み込みコマンドのロードに失敗した場合を除き、 返り値は 0 となります。
arg を読み込み、結合して 1 つのコマンドにされます。 次にシェルはこのコマンドを読み込んで実行し、 その終了ステータスが eval の値として返されます。 args が無い場合や空の引き数しかない場合には eval は 0 を返します。
command が指定されていると、シェルはこのコマンドに置き換えられます。 新しいプロセスは生成されません。 argumentscommand に対する引き数となります。 -l オプションを与えると、シェルは command に渡す 0 番目のオプションの先頭にダッシュを設定します。 これは login(1) が行う動作です。 -c オプションを与えると、 command は空の環境で実行されます。 -a を与えると、シェルは実行するコマンドに 0 番目の引き数として name を渡します。何らかの理由で command が実行できない場合には非対話的シェルは終了します。 ただしシェルオプション execfail が設定されている場合は終了せず、この場合には偽が返されます。 ファイルが実行できない場合には、対話的シェルは偽を返します。 command が指定されていない場合、任意のリダイレクトはカレントシェルで効果を表し、 終了ステータスは 0 となります。 リダイレクトのエラーが起きた場合には、終了ステータスは 1 となります。
ステータス n でシェルを終了させます。 n を省略すると、 終了ステータスは最後に実行したコマンドの終了ステータスとなります。 シェルが終了する前には、 EXIT に対するトラップが実行されます。
export [-fn] [name[=word]] ...
export -p
与えられた name には印が付けられ、 これ以降に実行するコマンドの環境に 自動的にエクスポートされるようになります。 -f オプションを与えると、 name は関数を参照します。 name を与えなかった場合や、 -p オプションを与えた場合には、 このシェル内でエクスポートされている全ての名前のリストが出力されます。 -n オプションを与えると、指定した変数からエクスポート属性が取り除かれます。 不正なオプションがあった場合、 name のいずれかが不正なシェル変数名であった場合、 関数でない名前に対して -f オプションを与えた場合を除き、 export は終了ステータス 0 を返します。
fc [-e ename] [-nlr] [first] [last]
フィックスコマンド (Fix Command)。 最初の形式では、 first から last までの範囲のコマンドが履歴リストから選択されます。 firstlast は文字列 (その文字列で始まる最後のコマンド) や 数値 (履歴リスト中でのインデックス。 負の値は現在のコマンド番号からのオフセットとして扱われます) としても指定できます。 last が指定されていなければ、リスト表示の場合には現在のコマンドが設定され (したがって ``fc -l -10'' で最近のコマンド 10 個が出力されます)、それ以外の場合には first が設定されます。 first が指定されていなければ、編集の場合には前のコマンドが設定され、 リスト表示の場合には -16 が設定されます。

-n オプションを与えるとリストにコマンド番号が付きません。 -r オプションを与えるとコマンドの順序が逆になります。 -l オプションを与えると、コマンドは標準出力にリスト表示されます。 それ以外の場合には、これらのコマンドが書かれたファイルに対し、 ename で指定したエディタが起動されます。 ename が与えられていない場合は、変数 FCEDIT の値が使われ、 FCEDIT も設定されていない場合には EDITOR の値が使われます。 どちらの変数も設定されていなければ、 vi が使われます。 編集が終了すると、編集されたコマンドがエコー表示され、実行されます。

2 番目の形式では、pat の部分をそれぞれ rep で置き換えた後に command が再実行されます。 これを利用している便利なエイリアスに ``r=fc -s'' があります。 これを用いると ``r cc'' と入力すれば ``cc'' で始まる最も新しいコマンドを実行でき、 ``r'' の入力すれば直前のコマンドを再実行できます。

最初の形式を用いた場合、不正なオプションがあるか、 first または last が履歴行の範囲外を指定していなければ、返り値は 0 となります。 -e オプションが与えられた場合、 返り値は最後に実行されたコマンドの返り値となるか、 あるいはコマンドの一時ファイルでエラーが起きた場合には偽となります。 2 番目の形式を用いた場合、 終了ステータスは再実行されたコマンドの終了ステータスとなります。 ただし、 cmd が有効な履歴行を指定していない場合は別で、この場合には fc は偽を返します。

jobspec の実行をフォアグラウンドで再開し、これをカレントジョブとします。 jobspec が無い場合、シェルが記録しているカレントジョブが使われます。 返り値はフォアグラウンドで再開されたコマンドの返り値ですが、 ジョブ制御が無効であるときに実行した場合や、 ジョブ制御が有効であっても jobspec が有効なジョブを指定していない場合や jobspec がジョブ制御無しで実行したジョブを指定している場合には偽となります。
getopts はシェルの手続きが位置パラメータを解釈するために使います。 optstring は識別の対象であるオプション文字列です。 ある文字の後にコロンがある場合、 そのオプションは引き数を取ることが期待されます。 引き数は空白でオプション文字と区切られていなければなりません。 コロンと疑問符はオプション文字として使えません。 呼び出される度に、 getopts は次に見つかったオプションをシェル変数 name に格納し (name が存在しなければ初期化を行います)、 次に処理される引き数のインデックスを変数 OPTIND に格納します。 OPTIND はシェルまたはシェルスクリプトが呼び出される度に 1 に初期化されます。 オプションが引き数を必要とする場合には、 getopts はその引き数を変数 OPTARG に格納します。 シェルが OPTIND を自動的に再設定することはありません。 1 つのシェルが呼び出されている間に別のパラメータの組合せを使う場合には、 getopts の呼び出しの間に手動で再設定を行わなければなりません。

オプションの終わりに到達すると、 getopts は 0 より大きい返り値で終了します。 OPTIND にはオプションでない最初の引き数のインデックスが設定され、 name には ? が設定されます。

getopts は通常位置パラメータを展開しますが、他の引き数が args に指定されている場合には、 getopts は位置パラメータでなくこれらを展開します。

getopts は 2 通りの方法でエラーを報告できます。 optstring の最初の文字がコロンならば、 静かな (silent) エラー報告が行われます。 通常の操作では、不正なオプションがある場合や オプションの引き数が足りない場合に診断メッセージが出力されます。 変数 OPTERR に 0 が設定されている場合、エラーメッセージは全く出力されません。 これは、 optstring の最初の文字がコロンでなくても同じです。

不正なオプションがあった場合、 getopts は ? を name に設定します。 さらに、静かなモードでない場合にはエラーメッセージが出力され、 OPTARG の設定が取り消されます。 getopts が静かなモードであれば、見つかったオプション文字は OPTARG に設定され、診断メッセージは出力されません。

必要な引き数が見つからず、かつ getopts が静かなモードでない場合には、疑問符 (?) が name に設定され、 OPTARG の設定が取り消され、診断メッセージが出力されます。 getopts が静かなモードならば、コロン (:) が name に設定され、 OPTARG には見つかったオプション文字が設定されます。

(指定の有無に関係なく) オプションが見つかった場合、 getopts は真を返します。 オプションの最後に到達した場合や、エラーが起きた場合には、 getopts は偽を返します。

name それぞれに対して、 $PATH 内のディレクトリの検索を行ってコマンドの完全なファイル名を調べ、 その結果を記憶します。 -p オプションが指定されると、パス検索は実行されず、 filename がそのコマンドの完全なファイル名として使われます。 -r オプションを与えると、シェルは記憶している位置を全て忘れます。 引き数が与えられていない場合は、 記憶しているコマンドに関する情報が出力されます。 name が見つからない場合と不正なオプションが与えられた場合を除き、 返却ステータスは真となります。
help [-s] [pattern]
組み込みコマンドのヘルプ情報を表示します。 pattern が指定された場合には、 help はこの pattern にマッチする全てのコマンドに関する詳しいヘルプを出力します。 それ以外の場合には、 全ての組み込みコマンドと制御構造についての説明が出力されます。 -s オプションは、表示されるヘルプ情報を短い書式の使用法に限定します。 pattern にマッチするコマンドが全くない場合を除き、返却ステータスは 0 です。
history [n]
history -c
history -d offset
history -anrw [filename]
history -p arg [arg ...]
history -s arg [arg ...]
オプションがない場合には、行番号付きでコマンド履歴を表示します。 * 付きでリスト表示されている行は変更された行です。 引き数 n を指定すると、最新の n 行だけがリスト表示されます。 filename が与えられている場合、 これは履歴ファイルの名前として使われます。 これが与えられていない場合には HISTFILE の値が使われます。(指定されていれば) オプションは以下の意味を持ちます:
履歴リストの全てのエントリを削除し、クリアします。
-d offset
offset 番目にある履歴エントリを削除します。
「新しい」履歴行 (bash の現在のセッションの開始以来入力された履歴行) を履歴ファイルに追加します。
まだ履歴ファイルから読み込んでいない履歴行を 現在の履歴リストに読み込みます。 これらは、bash の現在のセッションの開始以降に 履歴ファイルに追加された行です。
履歴ファイルの内容を読み込み、これらを現在の履歴として用います。
現在の履歴を履歴ファイルに書き込みます。履歴ファイルの内容は上書きされます。
後に続く args に対して履歴置換を行い、 その結果を標準出力に表示します。 この結果は履歴リストには格納されません。 通常の履歴展開が行われないようにするため、 arg はそれぞれクォートしなければなりません。
args を 1 つのエントリとして履歴リストに格納します。 履歴リストの最後のコマンドは、 args が追加される前に削除されます。

不正なオプションがある場合、 履歴ファイルの読み書きの間にエラーが起きた場合、 -d オプションの引き数として不正な offset の値が与えられた場合、 -p オプションの引き数として与えられた履歴展開が失敗した場合を除き、 返り値は 0 になります。

jobs [-lnprs] [ jobspec ... ]
最初の形式を実行すると、アクティブなジョブがリスト表示されます。 オプションは以下の意味を持ちます:
通常の情報に加えて、プロセス ID をリスト表示します。
そのジョブが属するプロセスグループのリーダーのプロセス ID だけを表示します。
ユーザがステータスを最後に通知されて以来、 ステータスの変更があったジョブに関する情報だけを表示します。
実行中のジョブだけを出力します。
停止中のジョブだけを出力します。

jobspec が与えられている場合、 そのジョブに関する情報だけが出力されるます。 不正なオプションがある場合や、不正な jobspec が与えられた場合を除き、返却ステータスは 0 です。

-x オプションが与えられた場合、 jobscommandargs 中で見つかった jobspec を全て対応するプロセスグループ ID に置き換え、 args を渡して command を実行し、その終了ステータスを返します。

kill [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
sigspec または signum で指定されたシグナルを、 pid または jobspec で指定されたプロセスに送ります。 sigspecSIGKILL のようなシグナル名、またはシグナルの番号です。 signum はシグナルの番号です。 sigspec がシグナル名ならば、その名前には SIG プレフィックスはあっても無くても構いません。 sigspec が無い場合には、 SIGTERM が指定されたものとします。 引き数に -l を与えるとシグナル名がリスト表示されます。 -l と同時に引き数を与えると、 引き数に対応するシグナルの名前がリスト表示され、 返却ステータスは 0 となります。 -l に対する引き数 exit_status は、 シグナル番号、またはシグナルによって終了させられた プロセスの終了ステータスを指定する数です。 少なくとも 1 つのシグナルを正常に送れた場合、 kill は真を返します。 エラーが起きた場合や不正なオプションがあった場合には、 kill は偽を返します。
arg は評価される算術式です ( 算術式展開 を参照)。 最後の arg を評価した結果が 0 であれば、 let は 1 を返します。 それ以外の場合には 0 が返されます。
それぞれの引き数に対して name という名前のローカル変数が生成され、 value が代入されます。 option には、 declare コマンドに使えるオプションがすべて使えます。 関数内で local を使った場合、この変数 name の可視スコープは、この関数とこの関数の子に制限されます。 オペランドが無い場合、 local はローカル変数の一覧を標準出力に出力します。 関数の内部以外で local を使うとエラーになります。 local が関数の外部で使われたり、 不正な name が与えられたり、 name が読み取り専用であったりしなければ、 local の返却ステータスは 0 となります。
ログインシェルを終了します。
ディレクトリスタックからエントリを削除します。 引き数が無い場合には、スタック先頭のディレクトリが削除され、 新しく先頭となったディレクトリへの cd が実行されます。 引き数が指定された場合には、これは以下の意味を持ちます:
+n
dirs で表示されるリストの左から数えて n 番目のエントリを削除します。 エントリは 0 から数えます。例えば、 ``popd +0'' は最初のディレクトリを削除し、 ``popd +1'' は 2 番目のディレクトリを削除します。
-n
dirs で表示されるリストの右から数えて n 番目のエントリを削除します。 エントリは 0 から数えます。例えば、 ``popd -0'' は最後のディレクトリを削除し、 ``popd -1'' は最後の 1 つ前のディレクトリを削除します。
スタックからディレクトリを削除する際に、 通常のディレクトリ変更を行いません。 したがって、スタックだけが操作されます。

popd コマンドが成功すれば、 dirs も実行され、返却ステータスは 0 となります。 popd が偽を返すのは、不正なオプションがあった場合・ ディレクトリスタックが空の場合・ ディレクトリスタックの存在しないエントリが指定された場合・ ディレクトリ変更に失敗した場合です。

arguments を整形して標準出力に書き出します。 フォーマットは format で制御します。 format は 3 つのタイプのオブジェクトを含む文字列です。 3 つのオブジェクトとは、(そのまま標準出力にコピーされる) プレーン文字・ (変換されて標準出力にコピーされる) 文字エスケープシーケンス・ (その後に続く引き数 argument それぞれの表示に用いられる) 表示フォーマット指定、です。 printf(1) 標準のフォーマット以外に、以下のフォーマットが使えます。 %b を用いると、printf は対応する argument 中の バックスラッシュのエスケープシーケンスを展開します。 また %q を用いると、printf は対応する argument をシェルの入力として再利用できるフォーマットで出力します。

format は必要に応じて再利用され、 全ての arguments を処理します。 与えられたよりも多くの argumentsformat が必要とする場合、余分のフォーマット指定は、 0 と空文字列のうち、適切な方が指定されたかのように動作します。 成功した場合の返り値は 0 で、失敗した場合の返り値は 0 以外です。

pushd [-n] [dir]
ディレクトリをディレクトリのスタックに追加するか、 スタックをローテートさせます。 この時、新しいスタックの最も上にあるものを カレントの作業ディレクトリにします。 引き数を与えなければ、 一番上の 2 つのディレクトリを交換し、0 を返します。 ただし、ディレクトリスタックが空の場合を除きます。 引き数を与えた場合には、以下の意味を持ちます:
+n
スタックをローテートさせ、n 番目のディレクトリを一番上にします。 このとき dirs が表示するリストは左から数え始め、その左端は 0 となります。
-n
スタックをローテートさせ、n 番目のディレクトリを一番上にします。 このとき dirs が表示するリストは右から数え始め、その右端は 0 となります。
ディレクトリをスタックに追加した時に、 通常のディレクトリ変更を行いません。 したがって、スタックだけが操作されます。
dir をディレクトリスタックの一番上に追加します。 また、このディレクトリを新しいカレントの作業ディレクトリにします。

pushd コマンドが成功すると、 dirs コマンドも実行されます。 最初の形式を使った場合、 dir への cd が失敗しなければ、 pushd は 0 を返します。 2 番目の形式を使った場合にも、 pushd は基本的には 0 を返します。 ただし、ディレクトリスタックが空の場合・ ディレクトリスタックの存在しない要素が指定された場合・ 指定された新しいカレントディレクトリへの ディレクトリ変更が失敗した場合は除きます。

現在の作業ディレクトリの絶対パス名を出力します。 -P オプションが指定された場合や、組み込みコマンド set-o physical オプションが有効になっている場合には、 出力されるパス名にはシンボリックリンクは含まれません。 -L オプションを使うと、 出力されるパス名にはシンボリックリンクが含まれているかもしれません。 カレントディレクトリの名前を読む際にエラーが起きたり、 不正なオプションが与えられなければ、返却ステータスは 0 となります。
標準入力から 1 行を読み込み、最初の単語を最初の name に代入し、2 番目の単語を 2 番目の name に代入します。以降も同様です。 余った単語とそれらの間の区切り文字は、最後の name に代入されます。 name よりも標準入力から読み込んだ単語の方が少ない場合には、 余っている name には空文字列が値として代入されます。 IFS 中の文字が、行を単語に分割するために使われます。 バックスラッシュ文字 (\) を使うと、 次に読み込んだ文字の特殊な意味を消したり、行を連結したりできます。 オプションが与えられていれば、以下の意味を持ちます:
-a aname
単語を配列変数 aname にインデックス順に代入します。インデックスは 0 から始まります。 新しい値が代入される前には、 aname の設定は消されます。他の name 引き数は無視されます。
-d delim
改行ではなく、delim の最初の文字が、入力行を終了するために使われます。
標準入力を端末から読み込む場合、 readline (前述の READLINE ライブラリ のセクションを参照) を使って行を取得します。
-n nchars
組み込みコマンド read は、 入力行全体が読み込まれるのを待たず、 文字 nchars を読み込んだ時に戻ります。
-p prompt
入力を読み込もうとする前にプロンプトを表示します。 末尾に改行は付きません。 プロンプトが表示されるのは、入力を端末から読み込む場合だけです。
バックスラッシュはエスケープ文字として作用しません。 バックスラッシュは行の一部と見なされます。 特に、バックスラッシュと改行の組合せを使って 複数の行を接続することはできません。
静かな (silent) モード。端末に入力が行われても、文字はエコーされません。
-t timeout
入力行全体が timeout 秒以内で読み込まれない場合、 read をタイムアウトさせて、失敗の状態を返します。 このオプションは、 read が入力を端末やパイプから読み込んでいない場合、 何も効果がありません。

name が全く与えられていない場合、読み込まれた行は変数 REPLY に代入されます。ファイル末尾に到達したり read がタイムアウトしたりしなければ、終了コードは 0 です。

指定された name に読み込み専用の印を付けます。 それ以降は、このような name の値を変更することはできません。 -f オプションを与えた場合、name に対応する関数に同様の印が付きます。 -a オプション与えると、配列変数だけが対象となります。 name 引き数が全く与えられてない場合、または -p オプションが与えられた場合、読み込み専用の名前全ての一覧が出力されます。 -p オプションを使うと、 入力として再利用できるようなフォーマットで出力が行われます。 返却ステータスは基本的に 0 ですが、 不正なオプションがあった場合、 name のいずれかが有効なシェル変数名で無かった場合、 -f オプションに関数でない name を与えた場合は除きます。
指定した返り値 n で関数を終了させます。 n を省略すると、返却ステータスは 関数内で最後に実行したコマンドの返却ステータスになります。 関数の外側で使われているが、 . (source) コマンドによるスクリプトの実行中である場合、 シェルはそのスクリプトの実行を止め、 n またはスクリプト内で最後に実行されたコマンドの終了ステータスを スクリプトの終了ステータスとして返します。 関数の外側で . によるスクリプトの実行中以外に使われた場合、 返却ステータスは偽となります。
オプション無しの場合は、シェル変数全ての名前と値の組が表示されます。 表示は、入力として再利用できるフォーマットで行われます。 出力は現在のロケールに従ってソートされます。 オプションが指定されている場合、 オプションはシェルの属性を設定または解除します。 オプションが処理された後に残っている引き数があれば、 これは位置パラメータの値として扱われ、 $1, $2, ... $n の順に代入されます。 オプションが指定されていれば、以下の意味を持ちます:
値を変更したり新規に設定したりした変数および関数が、 自動的に (後に実行するコマンドの) 環境として エクスポートされるようになります。
終了したバックグラウンドジョブのステータス報告を、 次のプライマリプロンプトの前ではなく、即座に行います。 これはジョブ制御が有効な場合に限り有効です。
単純なコマンド (前述の シェルの文法 セクションを参照) が 0 でないステータスで終了した場合、即座に終了します。 ただし失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または ⎪⎪ リストの一部である、 コマンドの返り値が ! で反転されている、のいずれかの場合にはシェルは終了しません。
パス名展開を無効にします。
コマンドの位置を記憶し、実行時にこれを引きます。 これはデフォルトで有効になっています。
代入文の形式を持つ全ての引き数を、コマンドに対する環境に追加します。 環境変数となるのは、コマンド名の前にあるものに限りません。
監視モード。ジョブ制御は有効になります。ジョブ制御 (前述の ジョブ制御 セクションを参照) をサポートしているシステム上の対話的シェルでは、 このオプションはデフォルトで有効です。 別のプロセスグループで実行されたバックグラウンドプロセスと、 これらの終了ステータスが書かれた行が、プロセスの終了時に表示されます。
コマンドを読み込みますが実行はしません。 これを使うとシェルスクリプトの文法エラーをチェックできます。 このオプションは対話的シェルでは無視されます。
-o option-name
option-name には、以下のいずれかを指定できます:
-a と同じです。
-B と同じです。
emacs 形式のコマンド行編集インタフェースを使います。 これはシェルが対話的な場合には、デフォルトで有効です。 ただし、 --noediting オプション付きでシェルを実行した場合は除きます。
-e と同じです。
-h と同じです。
-H と同じです。
コマンド履歴を有効にします。コマンド履歴については 履歴 セクションで説明しています。 このオプションは、対話的シェルではデフォルトで有効です。
効果は、シェルコマンドの ``IGNOREEOF=10'' を実行した場合と同様です (前述の シェル変数 を参照)。
-k と同じです。
-m と同じです。
-C と同じです。
-n と同じです。
-f と同じです。
-b と同じです。
-u と同じです。
-t と同じです。
-P と同じです。
bash の動作を変えます。 デフォルトの操作は POSIX 1003.2 標準と異なりますが、 これを標準に準拠するようにします (posix モード)。
-p と同じです。
-v と同じです。
vi 形式のコマンド行編集インタフェースを使います。
-x と同じです。

option-name 無しで -o オプションを与えた場合、現在のオプションが出力されます。 option-name 無しで +o オプションを与えた場合、現在のオプション設定を再生成する set コマンドの列が標準出力に出力されます。

特権 (privileged) モードを有効にします。このモードでは $ENV$BASH_ENV ファイルは処理されず、シェル関数は環境から継承されず、 SHELLOPTS 環境変数は定義されていても無視されます。 シェルを起動した時に実効ユーザ (グループ) ID が 実ユーザ (グループ) ID と異なり、 かつ -p オプションが与えられていない場合、 これらの動作が行われ、実効ユーザ ID には実ユーザ ID が設定されます。 起動時に -p オプションが与えられた場合、 実効ユーザ ID は再設定されません。 このオプションを無効にすると、 実効ユーザ ID と実効グループ ID には 実ユーザ ID と 実グループ ID が設定されます。
コマンドを 1 つ読み込み、実行してから終了します。
パラメータ展開の実行中に、設定が取り消されている変数をエラーとして扱います。 設定が取り消されている変数を展開しようとした場合、 シェルはエラーメッセージを出力します。 シェルが対話的でなければ、0 でないステータスで終了します。
シェルの入力行を、読み込んだ際に表示します。
単純なコマンドをそれぞれ展開した後、 PS4 を展開した値を表示し、その後にそのコマンドと展開した引き数を表示します。
シェルはブレース展開 (前述の ブレース展開 を参照) を実行します。これはデフォルトで有効です。
設定されている場合、 bash はリダイレクト演算子 >, >&, <> で既存のファイルを上書きしません。 上書きができるのは、リダイレクト演算子 >|> の代わりに使った時です。
! 形式の履歴置換を有効にします。 このオプションは、シェルが対話的な時にはデフォルトで有効です。
設定されている場合、 cd のような現在の作業ディレクトリを変更するコマンドを実行する時に、 シェルはシンボリックリンクを辿りません。 代わりに物理的ディレクトリ構造が使われます。 デフォルトでは、 bash がカレントディレクトリを変更するコマンドを実行する際には、 ディレクトリの論理的な接続が辿られます。
--
このオプションの後に引き数が続いていない場合には、 位置パラメータの設定が取り消されます。 それ以外の場合には、位置パラメータに arg の残りが設定されます。 これらに - で始まるものが含まれていても、 オプションではなく位置パラメータとして扱われます。
-
オプションの終わりを示します。 残りの arg は全て位置パラメータに代入されます。 -x オプションと -v オプションは無効になります。 arg が無い場合には、位置パラメータの内容は変化しません。

特に断らない限り、各オプションはデフォルトで無効になっています。 - の代わりに + を使うと、これらのオプションは無効になります。 オプションはシェルを起動する際の引き数としても指定できます。 現在のオプションの集合は、 $- で知ることができます。 不正なオプションが無ければ、終了ステータスは必ず真となります。

n+1 ... からの位置パラメータの名前を変え、 $1 ... とします。 $# から $#-n+1 までの数字で表される パラメータは unset されます。 n は 0 以上 $# 以下の数でなければなりません。 n が 0 ならば、どのパラメータも変更されません。 n が与えられない場合には、1 が指定されたものと見なされます。 n$# より大きい場合、位置パラメータは変化しません。 n$# より大きい場合や 0 より小さい場合には、 返却ステータスは 0 より大きい数になります。 それ以外の場合には 0 になります。
shopt [-pqsu] [-o] [optname ...]
シェルのオプション動作を制御する変数の値をトグルさせます。 オプションが無い場合や、 -p オプションが指定されている場合には、 設定可能なオプション全てのリストが表示されます。 表示の際には、それぞれが設定されているかどうかも示されます。 -p オプションが指定されていると、 オプションの表示は、入力として再利用できるフォーマットで行われます。 その他のオプションは、以下の意味を持っています:
optname をそれぞれ有効にします (設定します)。
optname をそれぞれ無効にします (設定解除します)。
通常の出力を止めます (静かなモード)。 返却ステータスは optname が設定されているかどうかを示します。 複数の optname 引き数と -q が指定されている場合には、 全ての optnames が有効である時に返却ステータスが 0 となります。 それ以外の時には、0 でない値となります。
optname の値を、組み込みコマンド set-o オプションで定義されているものに制限します。

引き数 optname 無しで -s オプションまたは -u オプションを使った場合、表示されるものは設定されているもの、 または設定されていないものにそれぞれ制限されます。 特に断らない限り、shopt オプションは デフォルトで無効 (設定解除) になっています。

オプションをリスト表示した時の返却ステータスは、 全ての optnames が有効になっている場合は 0 となります。 それ以外の場合には 0 でない値となります。 設定または設定取り消しのオプションの時には、 optname が不正なシェルオプションでなければ、 返却ステータスは 0 となります。

shopt オプションのリストを以下に示します:

設定されている場合、組み込みコマンド cd への引き数でディレクトリでないものは変数の名前と見なされ、 その値が変更先のディレクトリとなります。
設定されている場合、 cd コマンドのディレクトリ要素におけるスペルのちょっとした誤りは修正されます。 チェックされる誤りは、文字の入れ替わり・文字の欠け・ 1 文字余分にあることです。 訂正できた場合には、訂正後のファイル名が表示され、 コマンドは続けて実行されます。 このオプションが使われるのは対話的シェルだけです。
設定されている場合、 bash はハッシュ表で見つけたコマンドを実行する前に 実際に存在するかどうかをチェックします。 ハッシュされているコマンドが既に無くなっている場合、 通常のパス検索が行われます。
設定されている場合、bash はコマンドの実行後に毎回ウィンドウの大きさをチェックし、 必要に応じて LINESCOLUMNS の値を更新します。
設定されている場合、 bash は複数行に分かれているコマンドの全ての行を、 同じ履歴エントリに保存しようとします。 これを使うと、複数行に分かれているコマンドの再編集が容易になります。
設定されている場合、 bash は `.' で始まるファイル名をパス名展開の結果に含めます。
設定されている場合、 組み込みコマンド exec への引き数として指定されたファイルが実行できなくても、 対話的でないシェルが終了しません。 対話的シェルは exec に失敗しても終了しません。
設定されている場合、エイリアスが前述の エイリアス セクションで説明したように展開されます。 このオプションは、対話的なシェルではデフォルトで有効です。
設定されている場合、拡張されたパターンマッチング機能が有効になります。 これについては、前述のパス名展開で説明しています。
設定されている場合、シェルの終了時に履歴リストが変数 HISTFILE の値で指定しているファイルに追加されます。 ファイルへの上書きは行われなくなります。
この変数が設定されており、かつ readline が使われている場合、ユーザは失敗した履歴置換を再編集できます。
この変数が設定されており、かつ readline が使われている場合、履歴置換の結果は即座にはシェルのパーザに渡されません。 その代わり、結果として得られた行は readline の編集バッファに読み込まれ、さらに修正できます。
この変数が設定されており、かつ readline が使われている場合、bash@ を含む単語を補完する時にホスト名補完を実行しようとします (前述の READLINE ライブラリ のセクションにおける 補完 を参照)。 これはデフォルトで有効になっています。
設定されている場合、bash は対話的なログインシェルを終了する時に、 全てのジョブに SIGHUP を送ります。
設定されている場合、 # で始まる単語について、その単語とその行の残りの文字を 対話的シェルに無視させることができます (前述の コメント セクションを参照)。 このオプションはデフォルトで有効になっています。
設定されており、かつ cmdhist オプションが有効ならば、 複数行に分かれているコマンドは (セミコロンで区切られるのではなく) できる限り途中に改行を埋め込むことで履歴に保存されます。
設定されており、かつ bash がメールをチェックするファイルが 前回のチェック以降にアクセスされている場合、 メッセージ ``The mail in mailfile has been read'' が表示されます。
設定されており、かつ readline が使われている場合、 空行に対してコマンド補完をさせようとしたときに、 bash は補完用の PATH 検索を行いません。
設定されている場合、 bash はパス名展開 (前述の パス名展開 を参照) を行う時に、 ファイル名の大文字と小文字を区別せずにマッチングを行います。
設定されている場合、 bash はどのファイルにもマッチしないパターン (前述の パス名展開 を参照) を、その文字列自身ではなく、空文字列に展開します。
設定されている場合、プログラム補完機能 (前述のプログラム補完を参照) が有効になります。 このオプションはデフォルトで有効になっています。
設定されている場合、 プロンプト文字列に対して変数展開とパラメータ展開が行われます。 この展開は前述の プロンプト セクションで説明した展開が行われた後に行われます。 このオプションはデフォルトで有効になっています。
シェルが制限モードで起動された場合、 このオプションが設定されます (後述の 制限付きのシェル セクションを参照)。 この値を変更することはできません。 これは起動ファイルが実行される時にもリセットされないので、 シェルが制限付きかどうかを起動ファイル内部で知ることができます。
設定されている場合、組み込みコマンド shift においてシフトの回数が位置パラメータの数を超えると、 エラーメッセージが出力されます。
設定されている場合、組み込みコマンド source (.) は PATH の値を使って、引き数として与えられたファイルを含むディレクトリを見つけます。 このオプションはデフォルトで有効です。
設定されている場合、 組み込みコマンド echo は デフォルトでバックスラッシュによるエスケープシーケンスを展開します。
SIGCONT シグナルを受け取るまで、シェルの実行をサスペンドします。 suspend は、ログインシェルをサスペンドできません。しかし、 -f オプションを与えた場合、シェルがログインシェルであってもサスペンドできます。 シェルがログインシェルかつ -f が与えられていない場合、またはジョブ制御が有効でない場合を除いて、 返却ステータスは 0 です。
test expr
[ expr ]
条件式 expr を評価した結果に基づいて、ステータス 0 または 1 を返します。 演算子とオペランドそれぞれは別々の引き数でなければなりません。 式は前述の 条件式 セクションで説明したプライマリで構成されます。

式は次に示す演算子を使って結合できます。 優先度の高い順に示します。

! expr
expr が偽ならば真になります。
( expr )
expr の値を返します。 これを使うと、通常の演算子の優先度を変更できます。
expr1expr2 が両方とも真ならば真になります。
expr1expr2 のいずれかが真ならば真になります。

test および [ は、 引き数の数に基づいた規則の集合を用いて条件式を評価します。

引き数が 0 個
この式は偽です。
引き数が 1 個
引き数が空でない場合に限り真になります。
引き数が 2 個
最初の引き数が ! ならば、 2 番目の引き数が空の場合に限り真になります。 最初の引き数が、既に 条件式 セクションで説明した単項条件演算子のいずれかであれば、 単項の評価が真の場合に式は真となります。 最初の引き数が正しい単項条件演算子でなければ、式は偽となります。
引き数が 3 個
2 番目の引き数が、既に 条件式 セクションで説明した二値条件演算子のいずれかであれば、 最初と 3 番目の引き数をオペランドとして使った 二値評価の結果が式の結果となります。 最初の引き数が ! であれば、2 番目と 3 番目の引き数を使った、 引き数 2 つの評価の結果を否定したものが値となります。 最初の引き数が ( であり、3 番目の引き数が ) ならば、 2 番目の引き数を使って引き数 1 つの評価を行った値が結果となります。 これら以外の場合には、式は偽となります。 この場合においては、-a-o は二値演算子として扱われます。
引き数が 4 個
最初の引き数が ! ならば、 残りの引き数で作った引き数 3 つの式の値を否定したものが結果となります。 それ以外の場合には、先に挙げた規則を使った優先度に従って 式が展開・評価されます。
引き数が 5 個以上
先に挙げた規則を使った優先度に従って式が展開・評価されます。
シェルとシェルから実行したプロセスについて、 ユーザ時間とシステム時間を加えたものを出力します。 返却ステータスは 0 です。
シェルがシグナル sigspec を受け取ると、コマンド arg が読み込まれて、実行されます。 arg が存在しないか、 - である場合、 指定されているシグナルは全て最初の値 (シェルの起動時に設定されていた値) にリセットされます。 arg が空文字列である場合、それぞれの sigspec で指定されているシグナルは、 シェルとシェルが起動したコマンドから無視されます。 arg なしで -p オプションが与えられた場合、 各 sigspec に対応する trap コマンドが表示されます。 引き数が全く無いか、 -p だけが与えられた場合、 trap は各シグナル番号に対応するコマンドのリストを出力します。 それぞれの sigspec は、<signal.h> で定義されているシグナル名またはシグナル番号です。 sigspecEXIT (0) であれば、シェルの終了時にコマンド arg が実行されます。 sigspecDEBUG であれば、単純なコマンド (前述の シェルの文法 セクションを参照) が終わるたびにコマンド arg が実行されます。 -l オプションを与えると、 シェルはシグナル名とこれに対応する番号のリストを出力します。 シェルのエントリで無視されるシグナルは、 トラップもリセットもできません。 トラップされたシグナルはリセットされ、 子プロセスが生成された時の最初の値に戻ります。 sigspec のいずれかが不正であれば、返却ステータスは偽になります。 それ以外の場合には、 trap は真を返します。
オプション無しの場合には、各 name をコマンド名として使ったときに、それがどのように解釈されるかを示します。 -t オプションを使うと、 name が、エイリアス・シェルの予約語・関数・ 組み込みコマンド・ディスク上のファイルのいずれかの場合、 type はそれぞれに応じて alias, keyword, function, builtin, file という文字列を出力します。 name が見つからない場合は何も出力されず、偽の終了ステータスが返されます。 -p オプションを使うと、 typename をコマンド名として指定した場合に実行されるディスクファイルの名前、 または空文字列を返します。 空文字列が返されるのは、 ``type -t name'' が file を返さない場合です。 コマンドがハッシュされている場合、 -p はハッシュされている値を表示します。 表示されるのは、必ずしも PATH 中で最初に現われるファイルとは限りません。 -a オプションを使うと、 typename が示す実行ファイルがある場所を全て出力します。 -p オプションが同時に使われていない場合に限り、 エイリアスや関数も出力されます。 -a を使う時には、ハッシュされているコマンドの表は参照されません。 type は、引き数のいずれかが見つかれば真を返し、 どれも見つからなければ偽を返します。
これを使うと、シェルおよびシェルが起動するプロセスが 利用できるリソースを制御できます。 ただし、このような制御ができるシステムの場合に限ります。 limit の値はリソースに対して指定されている単位の数、または unlimited です。 -H オプションと -S オプションは、 それぞれ与えられたリソースに対する 強い (hard) 制限と弱い (soft) 制限を設定します。 強い制限は一度設定すると増やせません。 弱い制限は強い制限の値までは増やせます。 -H-S がどちらも指定されていない場合、 強い制限と弱い制限がどちらも設定されます。 limit を省略すると、リソースの弱い制限の現在値が表示されます。 ただし、-H が与えられている場合は除きます。 複数のリソースが指定されている時は、制限名と単位が値の前に出力されます。 他のオプションは以下のように解釈されます:
現在の制限を全て報告する
生成されるコアファイル (core) の最大サイズ
プロセスのデータセグメントの最大サイズ
シェルが生成できるファイルの最大サイズ
メモリにロックできる最大サイズ
常駐セットサイズの最大値
オープンできるファイル・ディスクリプターの最大数 (ほとんどのシステムでは、この値を設定することはできません)
512 バイトブロック単位でのパイプのサイズ (これは設定できないかもしれません)
最大スタックサイズ
CPU 時間の最大量 (秒単位)
1 人のユーザが使用できる最大のプロセス数
シェルが使用できる最大の仮想メモリ量

limit が与えられている場合、これは指定されたリソースの新しい値となります (-a は表示専用です)。 オプションが全く与えられなかった場合は、 -f が指定されたものと見なされます。 値は 1024 バイト単位で増えますが、例外として -t は秒単位、 -p 512 バイトブロック単位、 -n および -u は単位無しの値です。 返却ステータスは基本的に 0 ですが、 不正なオプションがある場合、 unlimited 以外の数字でない引き数が limit に指定された場合、 新しい制限を設定する際にエラーが起きた場合は除きます。

ユーザのファイル生成マスクに mode を設定します。 mode が数字で始まる場合には、これは 10 進数と解釈されます。 それ以外の場合には、 chmod(1) に指定するのと同様のシンボリックなモードマスクと解釈されます。 mode が省略されると、現在のマスクの値が出力されます。 -S オプションを指定すると、マスクはシンボリックな形式で表示されます。 デフルトの出力は 10 進の数値です。 -p オプションが指定され、かつ mode が省略された場合、入力として再利用できる形式で出力が行われます。 モードが正常に変更できた場合や、 mode 引き数が全く与えられなかった場合には、 返却ステータスは 0 となります。 それ以外の場合には偽となります。
name を定義されているエイリアスのリストから削除します。 -a が与えられている場合には、エイリアス定義は全て削除されます。 与えられた name が定義されているエイリアスであれば、返却ステータスは真になります。
name それぞれについて、対応する変数や関数を削除します。 オプションが全く与えられていない場合や、 -v オプションが与えられた場合は、各 name はシェル変数を参照します。 読み込み専用の変数の設定を消すことはできません。 -f が指定されている場合、各 name はシェル関数を参照し、その関数の定義が削除されます。 設定が消された変数や関数は全て、 それ以降のコマンドに渡される環境変数からも削除されます。 RANDOM, SECONDS, LINENO, HISTCMD, FUNCNAME, GROUPS, DIRSTACK のいずれかの設定を消した場合、これらの特殊な特性も無くなります。 これは後で再設定しても元に戻ることはありません。 name が存在しないか、読み込み専用の場合以外には、 終了ステータスは真となります。
指定されたプロセスを wait し、その終了ステータスを返します。 n はプロセス ID またはジョブ指定です。 ジョブ指定を与えた場合、そのジョブのパイプラインに含まれる 全てのプロセスを wait します。 n が与えられていない場合には、現在アクティブな全ての子プロセスを wait し、 返却ステータスは 0 となります。 n が存在しないプロセスやジョブを指定している場合、 返却ステータスは 127 になります。 それ以外の場合、返却ステータスは wait していた最後のプロセスまたはジョブの終了ステータスとなります。

制限付きのシェル(RESTRICTED SHELL)

bashrbash という名前で起動した場合や、起動時に -r オプションを指定した場合には、シェルは制限された状態になります。 制限付きのシェルは、 標準のシェルよりも細かく制御された環境を設定したいときに用います。 制限付きのシェルは bash と全く同じように動作しますが、 以下のようなことが許可されなかったり実行されなかったりします:

  • cd を使ってディレクトリを変更すること
  • SHELL, PATH, ENV, BASH_ENV の値の設定や設定取り消しを行なうこと
  • / を含むコマンド名を指定すること
  • 組み込みコマンド . の引き数として / を含むファイル名を指定すること
  • 組み込みコマンド hash に対するオプション -p の引数として / を含むファイル名を指定すること
  • 起動時にシェル環境から関数定義をインポートすること
  • 起動時にシェル環境から SHELLOPTS の値を展開すること
  • リダイレクション演算子 >, >|, <>, >&, &>, >> を使ってリダイレクトを行 なうこと
  • 組み込みコマンド exec を用いて、シェルを別のコマンドに置き換えること
  • 組み込みコマンド enable に対する -f オプションと -d オプションを使って、組み込みコマンドを追加・削除すること
  • 組み込みコマンド command-p オプションを指定すること
  • set +rset +o restricted を用いて制限モードを解除すること

これらの制限は、何らかの起動ファイルを読み込んだ後に適用されます。

シェルスクリプトであると判明したファイルが実行された時 (前述の コマンドの実行 を参照) には、 rbash はスクリプト実行用に立ち上げたシェルでは制限を全て無効にします。

関連項目

sh(1), ksh(1), csh(1)
emacs(1), vi(1)
readline(3)

ファイル

/bin/bash
bash の実行ファイル。
/etc/profile
システム全体用の初期化ファイル。ログインシェルが実行します。
~/.bash_profile
個人用の初期化ファイル。ログインシェルが実行します。
~/.bashrc
対話シェルごとに実行される、個人用の起動ファイル。
~/.bash_logout
個人用のログインシェル後処理ファイル。 ログインシェルの終了時に実行されます。
~/.inputrc
個人用の readline 初期化ファイル。

著者

Brian Fox, Free Software Foundation
bfox@gnu.org

Chet Ramey, Case Western Reserve University
chet@ins.CWRU.Edu

バグ報告

bash のバグを見つけたら必ず報告してください。 ただし報告の前には、それが本当にバグであることと、 バグが最新版の bash で起こることを確かめてください。

本当にバグがあると判断した場合には、 bashbug コマンドを使ってバグ報告を行います。 バグを修正してくださった場合には、 ぜひその内容も一緒にメールしてください! 提案や「哲学上の」バグ報告は、bug-bash@gnu.org にメールしたり、 ニュースグループの gnu.bash.bug に投稿してくださっても構いません。

バグ報告には必ず以下のことを書いてください:

ハードウェアとオペレーティングシステム
コンパイルに使ったコンパイラ
バグ動作の説明
バグを再現できる簡単なシェルスクリプトまたは「レシピ」

bashbug コマンドは、バグ報告を送るために用意されているテンプレートに、 最初の 3 項目を自動的に書き込みます。

このオンラインマニュアルに関するコメントやバグ報告は chet@ins.CWRU.Edu 宛にお願いします。

バグ

bash は大きすぎるし、遅すぎます。

bash と昔ながらのバージョンの sh にはちょっとした違いがいくつかあります。この大部分は POSIX の仕様のせいで生じたものです。

使い方によっては、エイリアスは混乱の元になります。

シェル組み込みコマンドとシェル関数は停止・再実行できません。

複合コマンドや `a ; b ; c' の形式のコマンド列は、 プロセスのサスペンドを行う際に綺麗に扱うことができません。 プロセスを停止すると、 シェルはコマンド列の次のコマンドを即座に実行するからです。 この問題はコマンド列を括弧の中に置いて サブシェルに実行させることで解決できます。 こうすれば、ひとまとまりのものとして停止できます。

$(...) を使ったコマンド置換の内部にあるコマンドは、 置換が実行される時まで展開されません。 これにより、コマンドを入力してしばらく経つまでエラー出力が遅れます。

配列変数は (まだ) エクスポートできません。

複数のループの中で break または continue を実行した時に、最も外側のループが一つ以上のコマンドを含んでいるなら、 break または continue の返り値は失われる。

2001 Mar 5 GNU Bash-2.05